При разработке или доработке документов в 1С часто возникает ситуация, когда документ формирует движения по регистру накопления, однако одно из измерений (например, ссылка на сам документ-регистратор) остается незаполненным. Рассмотрим, почему это происходит и как правильно заполнить требуемую колонку в модуле объекта при проведении.
Проанализируем типовую схему проведения документов, построенную на классических шаблонах 1С. Обычно алгоритм формирует таблицы движений на основе запросов к табличным частям документа или шапке. Если поле со ссылкой на документ не включено в текст запроса или структуру параметров формирования движений, то в создаваемый набор записей это измерение попадает с пустым значением (НЕОПРЕДЕЛЕНО или пустая ссылка).
При этом сам документ может успешно проводиться и записывать движения, но в регистре накопления нужная колонка останется незаполненной.
Разберем рабочий алгоритм решения этой задачи. Если движения по регистру уже сформированы стандартным процедурным механизмом конфигурации в процедуре ДвиженияПоРегистрам, мы можем выгрузить сформированный набор записей в таблицу значений, массово заполнить требуемое измерение ссылкой на текущий документ и загрузить данные обратно в набор движений.
Посмотрим на пример кода, который необходимо разместить в конце процедуры формирования движений перед установкой флага записи регистра:
// Выгружаем сформированные движения регистра в таблицу значений
ТаблицаДвижений = Движения.ВыполнениеМаршрутныхКарт.Выгрузить();
// Заполняем колонку с именем измерения ссылкой на текущий документ
ТаблицаДвижений.ЗаполнитьЗначения(ЭтотОбъект.Ссылка, "МаршрутнаяКарта");
// Загружаем обновленную таблицу обратно в набор движений
Движения.ВыполнениеМаршрутныхКарт.Загрузить(ТаблицаДвижений);
// Разрешаем запись набора движений
Движения.ВыполнениеМаршрутныхКарт.Записывать = Истина;
Выясним, с какими распространенными ошибками можно столкнуться при реализации данного алгоритма:
ЗаполнитьЗначения сам объект ЭтотОбъект вместо реквизита ЭтотОбъект.Ссылка (или просто Ссылка), платформа выдаст ошибку несоответствия типов. Измерение регистра с типом ссылки на документ принимает только значения типа ДокументСсылка.<ИмяДокумента>.ЗагрузитьЗначение у объекта ТаблицаЗначений приведет к ошибке «Метод объекта не обнаружен». Для массового заполнения колонок таблицы значений используется именно метод ЗаполнитьЗначения.ЗагрузитьКолонку: Метод ЗагрузитьКолонку ожидает в первом параметре массив значений одинаковой длины с числом строк таблицы, а не одиночное значение ссылки.Если алгоритм формирования движений строится на запросах к табличным частям, более производительным решением будет сразу добавить ссылку на документ в текст запроса или в структуру передаваемых полей:
СтруктураПолей.Вставить("МаршрутнаяКарта", "Ссылка");
В этом случае платформа автоматически заполнит измерение МаршрутнаяКарта нужной ссылкой еще на этапе формирования таблицы результатов запроса, и дополнительная постобработка таблицы движений в памяти не потребуется.