Как заполнить измерение регистра накопления ссылкой на документ при проведении в 1С?

Программист 1С v8.3 (Обычные формы) Управленческий учет Промышленность, строительство и АПК
← На главную

При разработке или доработке документов в 1С часто возникает ситуация, когда документ формирует движения по регистру накопления, однако одно из измерений (например, ссылка на сам документ-регистратор) остается незаполненным. Рассмотрим, почему это происходит и как правильно заполнить требуемую колонку в модуле объекта при проведении.

Причины возникновения проблемы

Проанализируем типовую схему проведения документов, построенную на классических шаблонах 1С. Обычно алгоритм формирует таблицы движений на основе запросов к табличным частям документа или шапке. Если поле со ссылкой на документ не включено в текст запроса или структуру параметров формирования движений, то в создаваемый набор записей это измерение попадает с пустым значением (НЕОПРЕДЕЛЕНО или пустая ссылка).

При этом сам документ может успешно проводиться и записывать движения, но в регистре накопления нужная колонка останется незаполненной.

Способ решения: заполнение через таблицу значений набора движений

Разберем рабочий алгоритм решения этой задачи. Если движения по регистру уже сформированы стандартным процедурным механизмом конфигурации в процедуре ДвиженияПоРегистрам, мы можем выгрузить сформированный набор записей в таблицу значений, массово заполнить требуемое измерение ссылкой на текущий документ и загрузить данные обратно в набор движений.

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


// Выгружаем сформированные движения регистра в таблицу значений
ТаблицаДвижений = Движения.ВыполнениеМаршрутныхКарт.Выгрузить();

// Заполняем колонку с именем измерения ссылкой на текущий документ
ТаблицаДвижений.ЗаполнитьЗначения(ЭтотОбъект.Ссылка, "МаршрутнаяКарта");

// Загружаем обновленную таблицу обратно в набор движений
Движения.ВыполнениеМаршрутныхКарт.Загрузить(ТаблицаДвижений);

// Разрешаем запись набора движений
Движения.ВыполнениеМаршрутныхКарт.Записывать = Истина;

Частые ошибки при написании кода

Выясним, с какими распространенными ошибками можно столкнуться при реализации данного алгоритма:

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

Альтернативный вариант: передача ссылки в запрос формирования движений

Если алгоритм формирования движений строится на запросах к табличным частям, более производительным решением будет сразу добавить ссылку на документ в текст запроса или в структуру передаваемых полей:

СтруктураПолей.Вставить("МаршрутнаяКарта", "Ссылка");

В этом случае платформа автоматически заполнит измерение МаршрутнаяКарта нужной ссылкой еще на этапе формирования таблицы результатов запроса, и дополнительная постобработка таблицы движений в памяти не потребуется.

← На главную