Может, кому-нибудь будет полезно.
Как известно, в типовых правилах конвертации документ "Сторно" не представлен.
В Бухгалтерии 3.0 сторнирование производится с помощью документа "ОперацияБух".
Если создавать этот документ руками, то он полностью заполняется проводками сторнируемого документа с противоположным знаком.
При создании правил обмена, важно правильно заполнить реквизит "СторнируемыйДокумент" и создать для этого типа ПКО.
Для этого реквизита обязательно указать в ПКС "ПередВыгрузкой":
ВыгрузитьТолькоСсылку = Истина;
В ПКС "СпособЗаполнения" пишем:
Значение = "Сторно";
Ну и наконец в обработчике "ПослеЗагрузки" пишем следующий код:
СуммаДокумента = 0;
//Если объект найден, очищаем движения
Если ОбъектНайден Тогда
Для Каждого Движение ИЗ Объект.Движения Цикл
Если Движение.Количество() > 0 Тогда
Точка = Найти(Строка(Движение), ".");
ВидРегистра = Лев(Строка(Движение), Точка - 13);
РегистрИмя = СокрП(Сред(Строка(Движение), Точка + 1));
Если ВидРегистра = "РегистрНакопления" Тогда
НаборЗаписей = РегистрыНакопления[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрБухгалтерии" Тогда
НаборЗаписей = РегистрыБухгалтерии[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрСведений" Тогда
НаборЗаписей = РегистрыСведений[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрРасчета" Тогда
НаборЗаписей = РегистрыРасчета[РегистрИмя].СоздатьНаборЗаписей();
КонецЕсли;
НаборЗаписей.Отбор.Регистратор.Установить(Объект.Ссылка);
Попытка
НаборЗаписей.Записать();
Исключение
КонецПопытки;
//Иначе
// НаборЗаписей = Движение;
КонецЕсли;
//Попытка
// НаборЗаписей.Записать();
//Исключение
//КонецПопытки;
КонецЦикла;
КонецЕсли;
//Объект необходимо записать, чтобы была на него ссылка
Объект.Записать(РежимЗаписиДокумента.Запись);
//Копируем движения сторнируемого документа со знаком минус
ДокОбъект = Объект.СторнируемыйДокумент.ПолучитьОбъект();
Для Каждого Движение ИЗ ДокОбъект.Движения Цикл
Точка = Найти(Строка(Движение), ".");
ВидРегистра = Лев(Строка(Движение), Точка - 13);
РегистрИмя = СокрП(Сред(Строка(Движение), Точка + 1));
Если ВидРегистра = "РегистрНакопления" Тогда
НаборЗаписей = РегистрыНакопления[РегистрИмя].СоздатьНаборЗаписей();
НовыйНаборЗаписей = РегистрыНакопления[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрБухгалтерии" Тогда
НаборЗаписей = РегистрыБухгалтерии[РегистрИмя].СоздатьНаборЗаписей();
НовыйНаборЗаписей = РегистрыБухгалтерии[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрСведений" Тогда
//Регистры сведений не сторнируются
Продолжить;
ИначеЕсли ВидРегистра = "РегистрРасчета" Тогда
НаборЗаписей = РегистрыРасчета[РегистрИмя].СоздатьНаборЗаписей();
НовыйНаборЗаписей = РегистрыРасчета[РегистрИмя].СоздатьНаборЗаписей();
КонецЕсли;
МетаданныеРегистра = НаборЗаписей.Метаданные();
НаборЗаписей.Отбор.Регистратор.Установить(Объект.СторнируемыйДокумент);
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() > 0 Тогда
НовыйНаборЗаписей.Отбор.Регистратор.Установить(Объект.Ссылка);
Для Каждого ЗаписьРегистра Из НаборЗаписей Цикл
НоваяЗапись = НовыйНаборЗаписей.Добавить();
ЗаполнитьЗначенияСвойств(НоваяЗапись,ЗаписьРегистра);
НоваяЗапись.Период = Объект.Дата;
Если ВидРегистра = "РегистрБухгалтерии" Тогда
Для Каждого Субконто Из ЗаписьРегистра.СчетДт.ВидыСубконто Цикл
БухгалтерскийУчет.УстановитьСубконто(НоваяЗапись.СчетДт, НоваяЗапись.СубконтоДт, Субконто.ВидСубконто.ИмяПредопределенныхДанных, ЗаписьРегистра.СубконтоДт[Субконто.ВидСубконто]);
КонецЦикла;
Для Каждого Субконто Из ЗаписьРегистра.СчетКт.ВидыСубконто Цикл
БухгалтерскийУчет.УстановитьСубконто(НоваяЗапись.СчетКт, НоваяЗапись.СубконтоКт, Субконто.ВидСубконто.ИмяПредопределенныхДанных, ЗаписьРегистра.СубконтоКт[Субконто.ВидСубконто]);
КонецЦикла;
СуммаДокумента = СуммаДокумента + ЗаписьРегистра.Сумма;
//Ресурс количество, но по Дт и по Кт может быть разное
Если ЗаписьРегистра.СчетКт.Количественный Тогда
НоваяЗапись.КоличествоКт = -ЗаписьРегистра.КоличествоКт;
КонецЕсли;
Если ЗаписьРегистра.СчетДт.Количественный Тогда
НоваяЗапись.КоличествоДт = -ЗаписьРегистра.КоличествоДт;
КонецЕсли;
КонецЕсли;
Для Каждого Ресурс из МетаданныеРегистра.Ресурсы Цикл
Попытка
//У всех ресурсов с типом "Число", кроме цены меняем знак на противоположный
Если ТипЗнч(ЗаписьРегистра[Ресурс.Имя]) = Тип("Число") Тогда
//У Цены знак не меняем
Если СтрНайти(Нрег(Ресурс.Имя),"цена") = 0 Тогда
НоваяЗапись[Ресурс.Имя] = -ЗаписьРегистра[Ресурс.Имя];
КонецЕсли;
КонецЕсли;
Исключение
КонецПопытки;
КонецЦикла;
КонецЦикла;
Попытка
НовыйНаборЗаписей.Записать();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЦикла;
Объект.СуммаОперации = -СуммаДокумента;
В общем, правило можно сделать для конвертации из любой конфигурации, хоть из 7.7.
Главное правильно сконвертировать сторнируемый документ, а дальше после загрузки заполнятся все движения Сторно.