Как указать конкретное значение в табличной части при конвертации данных 1С?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При переносе данных между конфигурациями 1С (например, при переходе со старых версий вроде 1С 7.7 на современные редакции 1С 8.3) разработчики часто сталкиваются с необходимостью постобработки загружаемых документов. Типичная задача — заполнить или скорректировать реквизиты в табличной части документов, которых не было в источнике или которые должны быть жестко определены в приемнике (например, ставка НДС 20% в табличной части «Товары»).

Разберем, почему возникают ошибки при попытке прямого обращения к реквизитам табличной части, и рассмотрим несколько надежных способов решения этой задачи с помощью инструмента «1С:Конвертация данных 2.1».

Выясняем причину ошибки: почему не работает прямое обращение?

Попытка обратиться к реквизиту табличной части напрямую через объект загрузки, например, с помощью кода Объект.СтавкаНДС = Перечисления.СтавкиНДС.НДС20 или Объект.Товары.СтавкиНДС, всегда будет приводить к ошибке выполнения кода. Выясним, почему это происходит.

В платформе 1С:Предприятие табличная часть документа (в данном случае Объект.Товары) представляет собой объект типа ТабличнаяЧасть. Этот объект является коллекцией строк, а не отдельной строкой. Сам объект коллекции не имеет свойств конкретной строки (таких как СтавкаНДС, Номенклатура или Количество). Эти реквизиты принадлежат исключительно строкам табличной части, которые имеют тип СтрокаТабличнойЧасти. Именно поэтому для изменения значений нам необходимо работать со строками этой коллекции.

Ниже мы подробно проанализируем четыре практических способа решения этой задачи — от простого перебора строк в цикле до более гибких и профессиональных архитектурных подходов.

Способ 1. Обход табличной части в цикле (классическое решение)

Самый простой и понятный способ заполнить реквизит для всех строк загруженного документа — выполнить обход коллекции в цикле. Этот код пишется в обработчике «После загрузки» в Правилах конвертации объектов (ПКО) для переносимого документа.

Рассмотрим пример кода, который выполняет эту задачу:


Для Каждого Стр Из Объект.Товары Цикл
    Стр.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
КонецЦикла;

Как это работает: Обработчик «После загрузки» выполняется в базе-приемнике сразу после того, как все свойства объекта были прочитаны из файла обмена и помещены в память, но до того, как сам объект будет записан в базу данных. Мы используем цикл Для Каждого, последовательно извлекаем каждую строку Стр из табличной части Товары и напрямую присваиваем реквизиту СтавкаНДС нужное значение из перечисления.

Способ 2. Использование свойства «Выражение» в ПКС (без написания циклов)

Если мы хотим решить задачу более изящно и избежать ручного написания циклов постобработки в объекте, мы можем настроить заполнение реквизита непосредственно на уровне Правил конвертации свойств (ПКС) внутри табличной части.

Разберем этот процесс по шагам:

  1. Откроем нужные Правила конвертации объектов (ПКО) в настройках правил обмена.
  2. Перейдем к табличной части Товары и найдем подчиненное правило конвертации свойства (ПКС) для реквизита СтавкаНДС.
  3. Оставим поле Источник пустым, так как в базе 7.7 этого реквизита может не быть или мы хотим проигнорировать его значение.
  4. В обработчике «Перед выгрузкой» для данного ПКС напишем следующую строку кода:

Выражение = "Перечисления.СтавкиНДС.НДС20";

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

Способ 3. Заполнение по умолчанию из карточки номенклатуры (умный импорт)

Прописывание конкретной ставки (например, строго 20%) непосредственно в коде конвертации может быть рискованным решением. У некоторых товаров в розничной или оптовой торговле ставка НДС может быть 10%, 0% или «Без НДС». Чтобы избежать ошибок в учете, правильнее использовать значения по умолчанию, которые уже настроены в карточке номенклатуры в базе-приемнике.

Посмотрим на пример реализации такого подхода в обработчике «После загрузки»:


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

Этот способ более универсален, так как он учитывает индивидуальные настройки каждого товара в информационной базе-приемнике и минимизирует ручное вмешательство программиста при изменении налогового законодательства.

Способ 4. Использование интерактивных параметров обмена

Если ставка НДС по умолчанию может периодически меняться в зависимости от условий переноса или желания пользователя, жестко прописывать ее в коде не рекомендуется. В этом случае правильнее использовать параметры конвертации, которые пользователь может заполнить перед началом выполнения обмена.

Рассмотрим, как настроить этот механизм:

  1. В «1С:Конвертации данных» перейдем на вкладку «Параметры» и создадим новый параметр с именем СтавкаНДСПоУмолчанию.
  2. Установим для него тип данных ПеречислениеСсылка.СтавкиНДС и взведем флаг «Передавать при выгрузке».
  3. В обработчике «После загрузки» документа напишем алгоритм заполнения с использованием этого параметра:

Для Каждого Стр Из Объект.Товары Цикл
    Стр.СтавкаНДС = Параметры.СтавкаНДСПоУмолчанию;
КонецЦикла;

Благодаря этому подходу пользователи смогут прямо на форме обработки выгрузки интерактивно выбрать, какую именно ставку НДС нужно установить для всех переносимых документов в данной сессии обмена.

← На главную