Результат проведения документа в базе 1С по регистрам зависит от текущего состояния базы 1С. Зависит он и от последовательности проведения документов. Хорошо, что не от положения звезд на небе. В задачах переносов данных между базами 1С часто хочется сделать "ксерокопию" документа, то есть перенести его в другую базу с точно такими же движениями. Чтобы они были на 100% такие же. Иногда есть возможность так сделать, иногда - нет. Обсудим эту тему максимально подробно.
Как в КД 2 разработать правила XML для переноса документов вместе с движениями?
Представьте, что правило конвертации для документа уже разработано. Его реквизиты и табличные части переносятся. Требуется доработать это правило конвертации, чтобы переносились еще и записи регистров, по которым документ формирует движения.
Порядок действий следующий:
- Выберите ПКО документа и нажмите кнопку Синхронизация свойств:
- Откроется форма Настройка правил конвертации свойств. Обычно мы в ней нажимаем кнопку Не показывать наборы движений. Но в этот раз нажимать ее не будем. Проверяем соответствие регистров. Если их имена отличаются, устанавливаемся соответствие вручную.
- На примере ниже установили флаг у свойства Сторно вручную. После создания правил конвертации регистров и свойств нужно будет написать алгоритм для этого свойства:
- В примере про Сторно напишем такой код:
- Для свойств составного типа обязательно пропишем в обработчике Перед выгрузкой алгоритм выбора ПКО. Алгоритм может выглядеть как на скриншоте (в правилах обязательно должен быть разработан алгоритм ВыбратьПКООбъекта):
Готовые правила переноса документов между базами 1С
Чтобы не разрабатывать алгоритмы переноса документов самостоятельно, используйте готовые решения. Мы в компании MoscowSoft с 2015 года специализируемся на разработке и выполнении переносов данных 1С.
Выбирайте готовый модуль для переноса данных 1С:
по выбору переноса данных 1С >>
Когда можно переносить документы вместе с движениями
Переносить документы сразу вместе с движениями можно только в случае, когда структуры конфигураций 1С именно в части регистров накопления, регистров бухгалтерии, регистров сведений и планов расчета почти на 100% совпадают.
Даже между ERP редакции 2.4 и 2.5 есть значительные отличия в структуре регистров, например, разные регистры накопления отвечают за остатки товаров. И переносить документы с движениями между такими конфигурациями 1С мы не рекомендуем.
Пример ситуации, когда можно переносить документы с движениями - это перенос зарплатных данных из ЗУП 3 / КА 2 / ERP в ЗУП 3 / КА 2 / ERP. Дело в том, что в эти конфигурации 1С встроена одинаковая версия одной и той же библиотеки БЗКР (библиотека зарплата кадры расширенная). И структура хранения данных почти полностью совпадает.
Примеры переносов данных 1С, где документы переносятся с движениями
Мы в компании MoscowSoft специализируемся на разработке и выполнении переносов данных 1С с 2015 года.
Перенос документов вместе с движениями поддерживается у нас в следующих переносах данных 1С:
- Перенос данных из ЗУП 3 в ЗУП 3
- Перенос данных из ЗУП 3 в КА 2
- Перенос данных из ЗУП 3 в ERP
- Перенос данных из КА 2 в ЗУП 3
- Перенос данных из ERP в ЗУП 3
- Перенос данных из БП 3 в БП 3
- Перенос данных из КА 2 в КА 2
- Перенос данных из КА 2 в ERP
Как устроены стандартные переносы данных компании MoscowSoft
Почти всегда перенос данных 1С выполняется между базами 1С, конфигурации которых сильно отличаются. Поэтому по умолчанию переносим документы без проводок. И запускаем проведение в приемнике после завершения загрузки данных только тех документов, которые были проведены в исходной базе 1С.
Подробно описали наш стандартный алгоритм переноса документов между базами 1С в отдельной статье >>
В отдельной статье написали наше мнение по вопросу, стоит ли переносить документы за много лет из одной базы 1С в другую, если хочется сохранить историю работы компании.
Когда нельзя переносить документы между базами 1С вместе с движениями
Ответ на этот вопрос интуитивно понятен. Нельзя переносить документы вместе с движениями, когда структура регистров сильно отличается между базами 1С источником и приемником выгрузки.
В этом вопросе нужно быть очень внимательным. Структура регистров и даже важнейший регистр хранения остатков товаров отличаются даже между ERP 2.4 и ERP 2.5. Хотя структура этих двух редакций программы 1С совпадает во всем остальном на 95%.
Под вопросом возможность переноса движений между программами УПП 1.3 и БП 3.0. Дело в том, что многие регистры накопления у этих программ совпадают по названию и структуре. Но в то же время план счетов бухгалтерского учета во многом отличается. Даже у совпадающих счетов учета виды субконто могут быть разными или находиться в разном порядке. Как обойти ситуацию отличий в плане счетов бухгалтерского счета, читайте ниже в пункте Перенос движений документа Операция бух.
И, если подытожить, в переносе данных из УПП 1.3 в Бухгалтерию 3.0 мы разработали алгоритмы переноса документов вместе с движениями по заказу одного из наших клиентов. Все получают эти правила и выгрузку документов вместе с движениями там легко включить в параметрах. Но делать это мы крайне не рекомендуем. Считаем, что наш обычный алгоритм переноса документов и старта их проведения после загрузки, является единственно верным.
Исправление ошибки, когда правила разработаны, а движений у документов после загрузки нету
Вы разработали правила конвертации для движений документа по регистрам накопления, регистрам бухгалтерии, и, возможно, по подчиненным регистрам сведений. Выполнили выгрузку. Проверили, что в файле с данными есть строки записей регистров.
Но после загрузки данных наблюдаете, что документы в базе 1С приемнике выглядят проведенными, но никаких движений не содержат. Встречали такую ситуацию? Она происходит из-за перезаписи регистров пустыми наборами записей.
Чтобы ее обойти, надо в обработчике После загрузки каждого документа, который переносите вместе с движениями, написать такой программный код (лучше вызывать его через алгоритм):
МетаданныеОбъекта = Объект.Метаданные(); Если Метаданные.Документы.Содержит(МетаданныеОбъекта) тогда ДвиженияВсе = Объект.Движения; МассивДвижений = новый Массив; Для каждого СтрокаДвижения из ДвиженияВсе Цикл МассивДвижений.Добавить(СтрокаДвижения.Выгрузить()); КонецЦикла; Объект.Записать(РежимЗаписиДокумента.Запись); ИИ = 0; Для Каждого ЭлеменМассива из МассивДвижений Цикл //Загрузим движения обратно НаборЗаписей = Объект.Движения[ИИ]; НаборЗаписей.Прочитать(); НаборЗаписей.Загрузить(ЭлеменМассива); НаборЗаписей.Записать(); ИИ = ИИ +1; КонецЦикла; КонецЕсли;
Выглядеть это может следующим образом:
Исправление ошибки переноса движений документа ОперацияБух
По умолчанию, даже если разработать правила конвертации движений по регистру бухгалтерии Хозрасчетный для документа Операция, он будет в базе 1С приемнике записан без каких либо движений. Это касается любого направления переноса. Мы чаще всего сталкиваемся с переносом этого документа либо в направлении конвертации данных УПП => Бухгалтерия, либо в УПП => ERP.
Чтобы движения появились в базе-приемнике, следуйте следующим рекомендациям ниже.
В обработчике После загрузки правила конвертации документа Операция напишите код для выгрузки движений в таблицу, далее запишите документ Операция, далее загрузите документу движения.
Выглядеть это может так:
- Код находится тут:
- Программный код алгоритма может быть следующим:
Объект.ОбменДанными.Загрузка = Ложь; //Если передают пустой набор, то организацию не определить Отказ = Объект.Движения.Хозрасчетный.Количество() = 0; Если Не Отказ Тогда НаборДвижений = Объект.Движения.Хозрасчетный; ТаблицаДвижений = НаборДвижений.Выгрузить(); Объект.Движения.Хозрасчетный.Записывать = истина; Если НЕ ЗначениеЗаполнено(Объект.Организация) Тогда //Агаларов 20.03.2019 У корректировки регистров организации нет. Берем первую из движений Объект.Организация = ТаблицаДвижений[0].Организация; КонецЕсли; Попытка // Чтобы документ точно записался Объект.Движения.Хозрасчетный.Очистить(); Объект.Записать(); Исключение ОписаниеОшибки = ОписаниеОшибки(); ЗаписьЖурналаРегистрации("ЗагрузкаДанных.ОшибкаЗаписиОперацииБух", УровеньЖурналаРегистрации.Ошибка, Объект.Метаданные(), Объект, ОписаниеОшибки); Если Параметры.ВыводитьОтладочныеСообщения Тогда Сообщить(ОписаниеОшибки); КонецЕсли; КонецПопытки; СтатьяПоУмолчанию = ПланыВидовХарактеристик.СтатьиРасходов.НайтиПоНаименованию("Статья расходов по умолчанию при переносе"); ТаблицаХозрасчетный = ТаблицаДвижений; Если ТаблицаХозрасчетный.Количество() <> 0 Тогда Для Каждого СтрокаТаблицы ИЗ ТаблицаХозрасчетный Цикл //Очистка корреспонденций с балансового и забалангсового счета Если СтрокаТаблицы.СчетДт = ПланыСчетов.Хозрасчетный.Вспомогательный Тогда Если ЗначениеЗаполнено(СтрокаТаблицы.СчетКт) И СтрокаТаблицы.СчетКт.Забалансовый Тогда СтрокаТаблицы.СчетДт = ПланыСчетов.Хозрасчетный.ПустаяСсылка(); КонецЕсли; КонецЕсли; Если СтрокаТаблицы.СчетКт = ПланыСчетов.Хозрасчетный.Вспомогательный Тогда Если ЗначениеЗаполнено(СтрокаТаблицы.СчетДт) И СтрокаТаблицы.СчетДт.Забалансовый Тогда СтрокаТаблицы.СчетКт = ПланыСчетов.Хозрасчетный.ПустаяСсылка(); КонецЕсли; КонецЕсли; // Очистка данных НУ на счетах где НУ не ведется Если НЕ СтрокаТаблицы.СчетДт.НалоговыйУчет Тогда СтрокаТаблицы.СуммаНУДт = 0; СтрокаТаблицы.СуммаВРДт = 0; СтрокаТаблицы.СуммаПРДт = 0; КонецЕсли; Если НЕ СтрокаТаблицы.СчетКт.НалоговыйУчет Тогда СтрокаТаблицы.СуммаНУКт = 0; СтрокаТаблицы.СуммаВРКт = 0; СтрокаТаблицы.СуммаПРКт = 0; КонецЕсли; // Очистка подразделений там где они не нужны Если НЕ СтрокаТаблицы.СчетДт.УчетПоПодразделениям И ЗначениеЗаполнено(СтрокаТаблицы.ПодразделениеДт) Тогда СтрокаТаблицы.ПодразделениеДт = Неопределено; Если Параметры.ВыводитьОтладочныеСообщения Тогда Сообщить("По документу " + Объект.Ссылка + " очищаем подразделение по счету " + СтрокаТаблицы.СчетДт); КонецЕсли; КонецЕсли; Если НЕ СтрокаТаблицы.СчетКт.УчетПоПодразделениям И ЗначениеЗаполнено(СтрокаТаблицы.ПодразделениеКт) Тогда СтрокаТаблицы.ПодразделениеКт = Неопределено; Если Параметры.ВыводитьОтладочныеСообщения Тогда Сообщить("По документу " + Объект.Ссылка + " очищаем подразделение по счету " + СтрокаТаблицы.СчетДт); КонецЕсли; КонецЕсли; Если СтрокаТаблицы.СчетДт = ПланыСчетов.Хозрасчетный.ОсновноеПроизводство Тогда Если Не ЗначениеЗаполнено(СтрокаТаблицы.СубконтоДт1) Тогда СтрокаТаблицы.СубконтоДт1 = Перечисления.ТипыЗатратРегл.Прочее; КонецЕсли; Если Не ЗначениеЗаполнено(СтрокаТаблицы.СубконтоДт2) И ЗначениеЗаполнено(СтатьяПоУмолчанию) Тогда СтрокаТаблицы.СубконтоДт2 = СтатьяПоУмолчанию; КонецЕсли; КонецЕсли; КонецЦикла; КонецЕсли; НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Регистратор.Установить(Объект.Ссылка); Для Каждого ТекущаяСтрока Из ТаблицаДвижений Цикл //добавлена проверка на забалансовый счет Если (ЗначениеЗаполнено(ТекущаяСтрока.СчетДт) и ТекущаяСтрока.СчетДт.Забалансовый) или (ЗначениеЗаполнено(ТекущаяСтрока.СчетКт) и ТекущаяСтрока.СчетКт.Забалансовый) Тогда //обрабатываем ИначеЕсли не ЗначениеЗаполнено(ТекущаяСтрока.СчетКт) или не ЗначениеЗАполнено(ТекущаяСтрока.СчетДт) тогда продолжить; КонецЕсли; Движение = НаборЗаписей.Добавить(); ЗаполнитьЗначенияСвойств(Движение,ТекущаяСтрока); Движение.Регистратор = Объект.Ссылка; // В Ка 2 / ЕРП у счетов могут быть другие виды субконто. Если ЗначениеЗаполнено(ТекущаяСтрока.ВидСубконтоДт1) И ЗначениеЗаполнено(ТекущаяСтрока.СубконтоДт1) И ТекущаяСтрока.СчетДт.ВидыСубконто.Найти(ТекущаяСтрока.ВидСубконтоДт1) <> Неопределено Тогда Движение.СубконтоДт[ТекущаяСтрока.ВидСубконтоДт1] = ТекущаяСтрока.СубконтоДт1; КонецЕсли; Если ЗначениеЗаполнено(ТекущаяСтрока.ВидСубконтоДт2) И ЗначениеЗаполнено(ТекущаяСтрока.СубконтоДт2) И ТекущаяСтрока.СчетДт.ВидыСубконто.Найти(ТекущаяСтрока.ВидСубконтоДт2) <> Неопределено Тогда Движение.СубконтоДт[ТекущаяСтрока.ВидСубконтоДт2] = ТекущаяСтрока.СубконтоДт2; КонецЕсли; Если ЗначениеЗаполнено(ТекущаяСтрока.ВидСубконтоДт3) И ЗначениеЗаполнено(ТекущаяСтрока.СубконтоДт3) И ТекущаяСтрока.СчетДт.ВидыСубконто.Найти(ТекущаяСтрока.ВидСубконтоДт3) <> Неопределено Тогда Движение.СубконтоДт[ТекущаяСтрока.ВидСубконтоДт3] = ТекущаяСтрока.СубконтоДт3; КонецЕсли; Если ЗначениеЗаполнено(ТекущаяСтрока.ВидСубконтоКт1) И ЗначениеЗаполнено(ТекущаяСтрока.СубконтоКт1) И ТекущаяСтрока.СчетКт.ВидыСубконто.Найти(ТекущаяСтрока.ВидСубконтоКт1) <> Неопределено Тогда Движение.СубконтоКт[ТекущаяСтрока.ВидСубконтоКт1] = ТекущаяСтрока.СубконтоКт1; КонецЕсли; Если ЗначениеЗаполнено(ТекущаяСтрока.ВидСубконтоКт2) И ЗначениеЗаполнено(ТекущаяСтрока.СубконтоКт1) И ТекущаяСтрока.СчетКт.ВидыСубконто.Найти(ТекущаяСтрока.ВидСубконтоКт2) <> Неопределено Тогда Движение.СубконтоКт[ТекущаяСтрока.ВидСубконтоКт2] = ТекущаяСтрока.СубконтоКт2; КонецЕсли; Если ЗначениеЗаполнено(ТекущаяСтрока.ВидСубконтоКт3) И ЗначениеЗаполнено(ТекущаяСтрока.СубконтоКт1) И ТекущаяСтрока.СчетКт.ВидыСубконто.Найти(ТекущаяСтрока.ВидСубконтоКт3) <> Неопределено Тогда Движение.СубконтоКт[ТекущаяСтрока.ВидСубконтоКт3] = ТекущаяСтрока.СубконтоКт3; КонецЕсли; КонецЦикла; Попытка НаборЗаписей.Записать(Истина); Исключение ОписаниеОшибки = "Документ: " + Объект.Комментарий + ", ошибка: " + ОписаниеОшибки(); ЗаписьЖурналаРегистрации("ЗагрузкаДанных.ОшибкаЗаписиДвиженийОперацииБух", УровеньЖурналаРегистрации.Ошибка, Объект.Метаданные(), Объект, ОписаниеОшибки); Если Параметры.ВыводитьОтладочныеСообщения Тогда Сообщить(ОписаниеОшибки); КонецЕсли; КонецПопытки; Отказ = Истина; КонецЕсли;
Обратите внимание, здесь мы еще обрабатываем ситуацию, когда виды субконто у планов счетов баз 1С отличаются. Также виды субконто могут быть одинаковыми, но иметь разный порядок. Такая ситуация тоже обрабатывается алгоритмом.

















































