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