При переходе с платформы 1С 7.7 на 1С 8.3 программисты часто сталкиваются с изменением архитектуры документов. Типичный пример — документ «Приходный кассовый ордер». В версии 7.7 такие реквизиты, как счет расчетов, договор или ставка НДС, располагались непосредственно в шапке документа. В современных конфигурациях на платформе 8.3 (например, «Бухгалтерия предприятия 3.0») эти данные вынесены в табличную часть для обеспечения возможности многострочных операций (оплата по нескольким договорам или счетам в одном ордере).
В этой статье мы подробно разберем, как с помощью механизма «Конвертация данных 2.1» (КД) правильно настроить перенос данных из «плоской» структуры 7.7 в табличную часть 8.3, а также выясним, почему могут не переноситься счета расчетов и как программно устанавливать значения перечислений.
Первая проблема, которую мы решим: в источнике (7.7) нет табличной части, а в приемнике (8.3) она есть. Для этого в правилах конвертации объектов (ПКО) для документа используется механизм ПКГС (Правила конвертации группы свойств).
Рассмотрим по шагам алгоритм настройки:
ПриходныйКассовыйОрдер) перейдем на закладку «Конвертация свойств».РасшифровкаПлатежа). Поле «Источник» при этом оставляем пустым, так как в 7.7 соответствующей таблицы нет.Проанализируем пример кода для обработчика Перед обработкой в ПКГС:
// Создаем таблицу значений, которая станет источником для ТЧ приемника
КоллекцияОбъектов = СоздатьОбъект("ТаблицаЗначений");
КоллекцияОбъектов.НоваяКолонка("ДоговорКонтрагента");
КоллекцияОбъектов.НоваяКолонка("СчетУчетаРасчетов");
КоллекцияОбъектов.НоваяКолонка("СуммаПлатежа");
КоллекцияОбъектов.НоваяКолонка("СтавкаНДС");
КоллекцияОбъектов.НоваяКолонка("СуммаНДС");
// Добавляем строку и заполняем ее данными из шапки документа 7.7
КоллекцияОбъектов.НоваяСтрока();
КоллекцияОбъектов.ДоговорКонтрагента = Источник.Договор;
КоллекцияОбъектов.СчетУчетаРасчетов = Источник.Счет; // Например, счет 62.1
КоллекцияОбъектов.СуммаПлатежа = Источник.Сумма;
КоллекцияОбъектов.СтавкаНДС = Источник.СтавкаНДС;
КоллекцияОбъектов.СуммаНДС = Источник.СуммаНДС;
Использование переменной КоллекцияОбъектов позволяет КД понять, что данные нужно брать из этой временной таблицы. После этого внутри ПКГС для каждого правила конвертации свойства (ПКС) в качестве источника нужно указывать имена колонок этой таблицы (ДоговорКонтрагента, СчетУчетаРасчетов и т.д.).
Часто возникает ситуация: в правилах всё настроено верно, соответствие счетов прописано, но после загрузки в 8.3 поле Счет расчетов оказывается пустым или заполняется значением по умолчанию. Разберем причину этого поведения.
В конфигурациях 1С 8.3 (особенно в БП 3.0) логика заполнения счетов расчетов жестко зашита в модули объектов. При загрузке документа через стандартную обработку V8Exch83.epf после создания объекта срабатывают стандартные обработчики платформы и конфигурации. Вызов функции типа ЗаполнитьСчетаРасчетов() обращается к регистру сведений «Счета расчетов с контрагентами». Если в этом регистре для данного контрагента и договора прописан счет, он перекроет то значение, которое вы передали из 7.7.
Чтобы решить эту проблему, рассмотрим два подхода:
Подход 1: Отключение автоматического заполнения
В обработчике документа «После загрузки» можно принудительно перезаписать счета из переданных параметров или установить флаг, предотвращающий перезаполнение, если такой предусмотрен в логике конфигурации.
Подход 2: Использование алгоритмов поиска
Проверьте ПКО для Плана счетов. В 1С 7.7 счет 62.1 — это строка или объект с кодом "62.1". В 8.3 это может быть "62.01". Если поиск настроен только по коду и маски кодов не совпадают, счет не будет найден. Выясним, настроено ли ПКО для ПланСчетовСсылка.Хозрасчетный с поиском по коду.
Рассмотрим ситуацию, когда в табличную часть 8.3 нужно передать значение перечисления (например, ВидПлатежа), которого просто не существует в базе 7.7. Настраивать соответствие не из чего, поэтому мы воспользуемся программной установкой.
В правилах конвертации свойств (ПКС) для данного реквизита:
// Указываем имя значения перечисления так, как оно задано в метаданных приемника
Значение = "НаложенныйПлатеж";
Если конфигурация-приемник загружена в базу «Конвертации данных», вы также можете выбрать «Фиксированное значение» в настройках ПКС, выбрав нужный элемент перечисления из выпадающего списка. Однако программный метод через Значение = ... является более гибким.
Проанализируем важный нюанс документа «Приходный кассовый ордер» в 8.3. Этот документ является многофункциональным. Его поведение (и состав табличных частей) зависит от реквизита ВидОперации.
Если вы загружаете данные в табличную часть Оплата, но при этом реквизит ВидОперации установился как ПрочееПоступление, то 1С 8.3 может «не видеть» вашу табличную часть, так как в этом режиме счета учета и суммы берутся из шапки (реквизит СчетКредита).
Рекомендация: Всегда явно передавайте ВидОперации. Если в 7.7 нет разделения, установите его принудительно в ПКО документа в обработчике «Перед выгрузкой»:
// Для расчетов с контрагентами
Значение = "ПоступлениеОплатыОтПокупателя";
Мы выяснили, что для успешной конвертации из 7.7 в 8.3 необходимо:
КоллекцияОбъектов для «разворачивания» шапки в таблицу.Применяя эти шаги, мы обеспечим целостность данных при переезде на новую платформу и минимизируем ручную коррекцию документов пользователями.