Переношу спр.Контрагенты на тонкий клиент из УПП 1.1
Соответственно вначале при создании нового контрагента идет процедура записи в регистр сведений контактная информация, после записи - идет ее считывание.
На форме спр.Контрагенты расположена ТЧ НаборКонтактнойИнформации
с типом РегистрСведенийНаборЗаписей.КонтактнаяИнформация - по аналогии с обычным приложением.

```1c
    &НаСервере
    Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

    Элементы.НаборКонтактнойИнформации.ТекущийЭлемент = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
    //Элементы.Список.ТекущаяСтрока[Измерение.Имя];

    Если НЕ Отказ Тогда
    ЗаписатьКонтактнуюИнформацию(НаборКонтактнойИнформации, Объект.Ссылка, Отказ);
    Иначе
    Возврат;
    КонецЕсли;

    Если Отказ Тогда
    Возврат;
    КонецЕсли;
    КонецПроцедуры

    &НаСервере
    Процедура ЗаписатьКонтактнуюИнформацию(НаборЗаписей, Ссылка, Отказ) Экспорт

    Если НЕ Отказ Тогда

    ЭталонныйНабор = НаборЗаписей.Выгрузить();

    Индекс = 0;
    Пока 1 = 1 Цикл

    Если Индекс > НаборЗаписей.Количество() - 1 Тогда
    Прервать;
    КонецЕсли;

    Запись = НаборЗаписей[Индекс];

    Если ОбщийМодуль.ЗначениеНеЗаполнено(Запись.Представление) Тогда
    НаборЗаписей.Удалить(Запись);
    Продолжить;
    КонецЕсли;

    Запись.Объект = Ссылка;

    Индекс = Индекс + 1;

    КонецЦикла;

    НаборЗаписей.Отбор.Объект.Значение = Ссылка;
    НаборЗаписей.Отбор.Объект.Использование = Истина;

    Попытка
    НаборЗаписей.Записать();//метод не обнаружен
    Исключение
    Сообщить(ОписаниеОшибки()+ "Элемент " + СокрЛП(Ссылка) + " Ошибка!! Не записана контактная информация.");
    // возвратим обратно данные набора
    НаборЗаписей.Загрузить(ЭталонныйНабор);
    Отказ = Истина;
    Возврат;
    КонецПопытки;

    ПрочитатьКонтактнуюИнформацию(НаборЗаписей, Ссылка)

    КонецЕсли;

    КонецПроцедуры
```

Говорит следующее
{Справочник.Контрагенты.Форма.ФормаЭлемента.Форма(99)}: Метод объекта не обнаружен (Записать)Элемент Юрьев М. Ошибка!! Не записана контактная информация.
---
Предполагаю, что колонки создаются программно для того, чтобы при изменении структуры регистра сведений с контактной информацией не надо было переделывать формы, где эти данные отображаются.

{РегистрСведений.КонтактнаяИнформация.Форма.ФормаСпискаУпр.Форма(20)}: Ошибка при вызове метода контекста (ДанныеФормыВЗначение)
ДанныеИсточника = ДанныеФормыВЗначение(Список, Тип("РегистрСведенийНаборЗаписей.КонтактнаяИнформация"));
по причине:
Несоответствие типов (параметр номер '1' )
Общий порядок действий при поиске подобных ошибок такой:
Устанавливаете точку останова на указанную строку
Выполняете код до нее, и на ней останавливаетесь
В ошибке говорят, что неверный тип параметра №1. В функции ДанныеФормыВЗначение в нашем случае 2 параметра. 1 параметр это Список.
Ставим курсор на слово "Список" в коде и нажимаем ctrl+F9. Открывается табло. В нем мы смотрим тип нашего списка.
Открываем справку и выясняем какой тип требуется для первого параметра нашей функции
Много думаем про то, где нам взять требуемый тип и понимаем, что он живет в элементах формы ("Элементы.Список")
Нет возможности проверить свои догадки, но думаю, вам надо либо поменять "Список" на "Элементы.Список" либо воспользоваться другой функцией РеквизитФормыВЗначение. Отработает ли блокировка не берусь сказать. Надо проверять.
---
Попробуйте присваивать набор записи не элементу или реквизиту, а переменной и оперировать дальше уже ей.
---
Dr.DragoN, пробовал как вариант), просто потом переменная не отображает результат выборки,
или как вариант потом из переменной читать на форму данные?
---
Попробуйте такой код при вызове процедуры ЗаписатьКонтактнуюИнформацию

```1c
    Если НЕ Отказ Тогда
    НаборКИ = ДанныеФормыВЗначение(НаборКонтактнойИнформации, Тип("РегистрСведенийНаборЗаписей.КонтактнаяИнформация"));
    ЗаписатьКонтактнуюИнформацию(НаборКИ, Объект.Ссылка, Отказ);
    ЗначениеВДанныеФормы(НаборКИ, НаборКонтактнойИнформации);
    Иначе
    Возврат;
    КонецЕсли;
```
---
deniskind, а что тут ф-я будет рекурсиво вызыватьс?
---
Нет, конечно!
В процедуре ПриЗаписиНаСервере есть вызов функции ЗаписатьКонтактнуюИнформацию. Вот, там, где этот вызов подставить обрамление из функций ДанныеФормыВЗначение и ЗначениеВДанныеФормы.
---
deniskind, понятно если делать так

```1c
    &НаСервере
    Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

    НаборКонтактнойИнформации = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();

    Если НЕ Отказ Тогда
    НаборКИ = ДанныеФормыВЗначение(НаборКонтактнойИнформации, Тип("РегистрСведенийНаборЗаписей.КонтактнаяИнформация"));
    ЗаписатьКонтактнуюИнформацию(НаборКИ, Объект.Ссылка, Отказ);
    ЗначениеВДанныеФормы(НаборКИ, НаборКонтактнойИнформации);
    Иначе
    Возврат;
    КонецЕсли;
    ..........................
```

{Справочник.Контрагенты.Форма.ФормаЭлемента.Форма(7)}: Ошибка при установке значения атрибута контекста (НаборКонтактнойИнформации)
НаборКонтактнойИнформации = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
по причине:
Нельзя изменять поле, содержащее объект данных формы
---
В вашем исходном коде этой строки небыло:

```1c
    НаборКонтактнойИнформации = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
```

В данном случае она будет лишней.
Кстати, вот это:

```1c
    Элементы.НаборКонтактнойИнформации.ТекущийЭлемент = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
```

Тоже, думаю, не нужно было.
---
deniskind, без этой записи НаборКонтактнойИнформации = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
в регистр сведений контакная информация не добавляются новые виды адресов по контрагенту, а просто перезаписывается 1-на запись. Также при чтении контактов на форме ничего не отображается. Хотя в отладчике есть данные. Быть может опять не то чтение через сервер? Код чтения:

```1c
    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
    ПриОткрытииЧтениеКонтактов()
    КонецПроцедуры

    &НаСервере
    Процедура ПриОткрытииЧтениеКонтактов()
    НаборКИ = ДанныеФормыВЗначение(НаборКонтактнойИнформации, Тип("РегистрСведенийНаборЗаписей.КонтактнаяИнформация"));
    ПрочитатьКонтактнуюИнформацию(НаборКИ, Объект.Ссылка);
    КонецПроцедуры

    &НаСервере
    Процедура ПрочитатьКонтактнуюИнформацию(НаборЗаписей, Ссылка) Экспорт

    //Если ТипЗнч(НаборЗаписей) <> Тип("РегистрСведенийНаборЗаписей.КонтактнаяИнформация") Тогда
    // НаборЗаписей = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
    //Иначе
    // НаборЗаписей.Очистить();
    //КонецЕсли;

    НаборЗаписей.Отбор.Объект.Значение = Ссылка;
    НаборЗаписей.Отбор.Объект.Использование = Истина;
    НаборЗаписей.Прочитать();

    ТаблицаНабора = НаборЗаписей.Выгрузить();
    ТаблицаНабора.Сортировать("Тип ВОЗР, Вид ВОЗР");
    НаборЗаписей.Загрузить(ТаблицаНабора);
    КонецПроцедуры
```

(11) VadimGorbunov, для удобного представления информации- наглядно)
---
Вот это должно быть в процедуре ПриСозданииНаСервере

```1c
    Если НЕ Объект.Ссылка = Справочники.Контрагенты.ПустаяСсылка() Тогда
    НаборЗаписей = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Объект.Значение = Объект.Ссылка;
    НаборЗаписей.Отбор.Объект.Использование = Истина;
    НаборЗаписей.Прочитать();
    ЗначениеВДанныеФормы(НаборЗаписей, НаборКонтактнойИнформации);
    КонецЕсли;
```

НаборКонтактнойИнформации - это должен быть реквизит с типом "РегистрСведенийНаборЗаписей.КонтактнаяИнформация". Этот реквизит имеет отображение Таблица (с аналогичным названием).
Строка кода:

```1c
    НаборКонтактнойИнформации = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
```

Не нужна в процедуре записи, т.к. создание набора происходит до открытия формы.
Также, потребуется отработать запись нового контрагента. Надо будет устанавливать отбор по контрагенту у набора записей.
---
deniskind, Также, потребуется отработать запись нового контрагента. Надо будет устанавливать отбор по контрагенту у набора записей.
C чтением данных вроде получилось.
Попытался установить отбор при запсии нового контрагента таким образом:

```1c
    &НаСервере
    Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

    Если НЕ Отказ Тогда
    НаборКИ = ДанныеФормыВЗначение(НаборКонтактнойИнформации, Тип("РегистрСведенийНаборЗаписей.КонтактнаяИнформация"));
    ЗаписатьКонтактнуюИнформацию(НаборКИ, Объект.Ссылка, Отказ);
    ЗначениеВДанныеФормы(НаборКИ, НаборКонтактнойИнформации);
    Иначе
    Возврат;
    КонецЕсли;

    Если Отказ Тогда
    Возврат;
    КонецЕсли;
    КонецПроцедуры

    &НаСервере
    Процедура ЗаписатьКонтактнуюИнформацию(НаборЗаписей, Ссылка, Отказ) Экспорт
    Если НЕ Отказ Тогда

    ЭталонныйНабор = НаборЗаписей.Выгрузить();

    Индекс = 0;
    Пока 1 = 1 Цикл

    Если Индекс > НаборЗаписей.Количество() - 1 Тогда
    Прервать;
    КонецЕсли;

    Запись = НаборЗаписей[Индекс];

    Если ОбщийМодуль.ЗначениеНеЗаполнено(Запись.Представление) Тогда
    НаборЗаписей.Удалить(Запись);
    Продолжить;
    КонецЕсли;

    Запись.Объект = Ссылка;

    Индекс = Индекс + 1;

    КонецЦикла;

    ////////////////////////////////////////////////////////////­//////////////////
    Если НЕ Объект.Ссылка = Справочники.Контрагенты.ПустаяСсылка() Тогда
    НаборЗаписей = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Объект.Значение = Объект.Ссылка;
    НаборЗаписей.Отбор.Объект.Использование = Истина;
    ////////////////////////////////////////////////////////////­//////////////////
    Попытка
    //пишем здесь нашу запись
    НаборЗаписей.Записать();
    //НаборЗаписей.Добавить();
    //ЗаполнитьЗначенияСвойств(НаборЗаписей.Записать(), Запись)
    Исключение
    Сообщить(ОписаниеОшибки()+ "Элемент " + СокрЛП(Ссылка) + " Ошибка!! Не записана контактная информация.");
    // возвратим обратно данные набора
    НаборЗаписей.Загрузить(ЭталонныйНабор);
    Отказ = Истина;
    Возврат;
    КонецПопытки;
    КонецЕсли;
    КонецЕсли;

    КонецПроцедуры
```

Не срабатывает отбор(. Удаляет все созданные ранее записи
---
А вот это зачем:

```1c
    //////////////////////////////////////////////////////////////////////////////
    Если НЕ Объект.Ссылка = Справочники.Контрагенты.ПустаяСсылка() Тогда
    НаборЗаписей = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Объект.Значение = Объект.Ссылка;
    НаборЗаписей.Отбор.Объект.Использование = Истина;
    ////////////////////////////////////////////////////////////­//////////////////
```

Я думаю без этого сработает.
Вы передаете НаборЗаписей в процедуру записи. Обрабатываете этот набор. А потом, зачем-то, снова создаете набор записей, пустой. И сразу его записываете. Скорее всего у вас не замещаются все записи, а замещаются все записи по данному отбору.
---
deniskind, запись с чтением получилась)).
в типофой конфе на толстом клиенте в рег. свед. контактная информация в модуле формы есть 3 процедуры
РегистрСведенийСписокПередНачаломИзменения
РегистрСведенийСписокПередНачаломДобавления
РегистрСведенийСписокВыбор
также такой свободный код без процедур

```1c
    Для каждого Измерение Из Метаданные.РегистрыСведений.КонтактнаяИнформация.Измерения Цикл
    РегистрСведенийСписок.Колонки.Добавить(Измерение.Имя);
    КонецЦикла;
    Для каждого Ресурс Из Метаданные.РегистрыСведений.КонтактнаяИнформация.Ресурсы Цикл
    РегистрСведенийСписок.Колонки.Добавить(Ресурс.Имя);
    КонецЦикла;
    Для каждого Реквизит Из Метаданные.РегистрыСведений.КонтактнаяИнформация.Реквизиты Цикл
    РегистрСведенийСписок.Колонки.Добавить(Реквизит.Имя);
    КонецЦикла;
```

эти процедуры - нужно переносить- по моему они созданы лишь для информирования пользовтеля о выборе текущего поля?
Или же для простого функционала спр. контрагенты достаточно чтения/записи?
(17) asved.ru, КД тут может чем то помочь? если еще не созданы обработчики основные для чтения/записи. Конфа самокат просто.
---
Не скажу, что было в УПП 1.1, но в 1.3 ПередНачаломРедактирования и ПередНачаломДобавления устанавливается блокировка данных, чтобы никто не смог изменить тот же набор записей, пока он редактируется из этого сеанса, а также, вызывается специальная обработка для редактирования контактной информации. Обработка выбора отсутствует. код вне процедур это то, что вызывается при создании формы. В вашем случае это создание колонок по измерениям ресурсам и реквизитам регистра сведений.
В общем случае наложение блокировок является необходимым условием. Учитывая, трудности, с которыми вы столкнулись вам, лучше всего, изучить тему подробнее с использованием литературы или курсов.
Решение с записью/чтением регистра с точки зрения упрощенной функциональности работать будет, но подводные камни обязательно всплывут :)
---
Deniskind, понятно, на счет создания колонок - не совсем понятно для чего их программно еще раз создавать? Форму редактирования инфы пропущу)- гемора много. На счет блокировок - попробовал так:
В молуде формы рег. сведений контактная инфа

```1c
    &НаКлиенте
    Процедура СписокПередНачаломИзменения(Элемент, Отказ)
    БлокировкаДанных();
    КонецПроцедуры

    &НаСервере
    Процедура БлокировкаДанных()

    Блокировка = Новый БлокировкаДанных;
    ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.КонтактнаяИнформация");
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
    ДанныеИсточника = ДанныеФормыВЗначение(Список, Тип("РегистрСведенийНаборЗаписей.КонтактнаяИнформация"));
    ЭлементБлокировки.ИсточникДанных = ДанныеИсточника;
    ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Объект", "Объект");

    КонецПроцедуры
```

пишет {РегистрСведений.КонтактнаяИнформация.Форма.ФормаСпискаУпр.Форма(20)}: Ошибка при вызове метода контекста (ДанныеФормыВЗначение)
 ДанныеИсточника = ДанныеФормыВЗначение(Список, Тип("РегистрСведенийНаборЗаписей.КонтактнаяИнформация"));
по причине:
Несоответствие типов (параметр номер '1'
На форме добавлена ТЧ список(объект тип вид представление)
---
Предполагаю, что колонки создаются программно для того, чтобы при изменении структуры регистра сведений с контактной информацией не надо было переделывать формы, где эти данные отображаются.

{РегистрСведений.КонтактнаяИнформация.Форма.ФормаСпискаУпр.Форма(20)}: Ошибка при вызове метода контекста (ДанныеФормыВЗначение)
ДанныеИсточника = ДанныеФормыВЗначение(Список, Тип("РегистрСведенийНаборЗаписей.КонтактнаяИнформация"));
по причине:
Несоответствие типов (параметр номер '1' )
Общий порядок действий при поиске подобных ошибок такой:
Устанавливаете точку останова на указанную строку
Выполняете код до нее, и на ней останавливаетесь
В ошибке говорят, что неверный тип параметра №1. В функции ДанныеФормыВЗначение в нашем случае 2 параметра. 1 параметр это Список.
Ставим курсор на слово "Список" в коде и нажимаем ctrl+F9. Открывается табло. В нем мы смотрим тип нашего списка.
Открываем справку и выясняем какой тип требуется для первого параметра нашей функции
Много думаем про то, где нам взять требуемый тип и понимаем, что он живет в элементах формы ("Элементы.Список")
Нет возможности проверить свои догадки, но думаю, вам надо либо поменять "Список" на "Элементы.Список" либо воспользоваться другой функцией РеквизитФормыВЗначение. Отработает ли блокировка не берусь сказать. Надо проверять.
---
Deniskind, ни Элементы.Список, ни список и РеквизитФормыВЗначение не дают отладки без ошибки.
В српавке вродь аписано о 1 параметер так:
Тип: ДанныеФормыСтруктураСКоллекцией; ДанныеФормыКоллекция; ДанныеФормыСтруктура; ДанныеФормыДерево.
Данные формы.
<Тип> (обязательный)
тоесь тип данныеФормы. Что то тут снова с передачей с формы))
---
Какого типа у вас Список вот в этой строке кода:

```1c
    ДанныеИсточника = ДанныеФормыВЗначение(Список, Тип("РегистрСведенийНаборЗаписей.КонтактнаяИнформация"));
```

Вообще, посмотрел внимательнее про блокировку в УПП. Там используется не транзакционная блокировка записей, а объектная. Т.е. при изменении контактной информации блокируется не набор записей, а объект контрагент с помощью вызова метода Заблокировать() И если редактирование контактной информации (по конкретному контрагенту) осуществляется только из контрагентов то этого будет достаточно.
А если, все же очень хочется блокировать записи, то можно написать как то так:

```1c
    Блокировка = Новый БлокировкаДанных;
    ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.КонтактнаяИнформация");
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
    ЭлементБлокировки.УстановитьЗначение("РегистрСведений.КонтактнаяИнформация.Объект", ОбъектСсылка);
    Блокировка.Заблокировать();
```

Где ОбъектСсылка - ссылка на нашего контрагента. Но еще должен быть соблюден ряд условий. Не берусь перечислить весь перечень. Но, например - блокировка работает только в транзакции, какой тип блокировки стоит у конфигурации и у конкретного регистра сведений.
Так же, существует третий вариант - устанавливать блокировку при записи НабораЗаписей (есть такой метод у набора)
---
Manticor, возьмите любые типовые правила для КД и посмотрите, как там реализована запись в регистры сведений.
---
Предлагаю упростить вообще:

```1c
    &НаСервере
    Процедура ЗаписатьКонтактнуюИнформацию(НаборЗаписей, Ссылка, Отказ) Экспорт

    Если НЕ Отказ Тогда

    ЭталонныйНабор = НаборЗаписей.Выгрузить();

    Для каждого Запись Из НаборЗаписей Цикл
    Если ОбщийМодуль.ЗначениеНеЗаполнено(Запись.Представление) Тогда
    НаборЗаписей.Удалить(Запись);
    Иначе
    Запись.Объект = Ссылка;
    КонецЕсли;
    КонецЦикла;

    Попытка
    НаборЗаписей.Записать();
    Исключение
    Сообщить(ОписаниеОшибки()+ "Элемент " + СокрЛП(Ссылка) + " Ошибка!! Не записана контактная информация.");
    // возвратим обратно данные набора
    НаборЗаписей.Загрузить(ЭталонныйНабор);
    Отказ = Истина;
    Возврат;
    КонецПопытки;

    КонецЕсли;

    КонецПроцедуры
```
---
Соответственно вначале при создании нового контрагента идет процедура записи в регистр сведений контактная информация, после записи - идет ее считывание - это не совсем так. Вначале надо записать контрагента, только после этого можно записать контактную информацию.
---
Владимир, событие ПриЗаписи срабатывает уже после того, как данные были записаны в БД. Учитывая, что в коде отрабатывается отказ, тут все ОК.
---
В чём необходимость переводить справочник "Контрагенты" на тонкий клиент? - В управляемых приложениях, например, в УТ 11, у этого справочника совершенно другая структура - контактная информация реализована как табличная часть справочника, а регистра сведений "Контактная информация" там нет вообще. Это сделано, видимо, как раз для того, чтобы избежать проблем при записи.
---
Конвертацию данных учите и не изобретайте велосипеды.