При настройке синхронизации данных между конфигурациями «1С:Розница» и, например, «1С:Бухгалтерия предприятия» пользователи часто сталкиваются с проблемой: при регистрации и отправке документа ПоступлениеТоваровУслуг связанный с ним документ СчетФактураПолученный не регистрируется к обмену автоматически. В результате бухгалтеру приходится вручную искать и регистрировать счета-фактуры, что превращается в рутину при больших объемах документооборота.
В этой статье мы подробно разберем, как автоматизировать этот процесс. Мы рассмотрим четыре практических способа решения задачи: от изменения правил регистрации объектов до программирования расширения и использования встроенных интерактивных инструментов БСП (Библиотеки стандартных подсистем).
---
Этот способ является наиболее правильным с точки зрения архитектуры обмена 1С. Мы настроим правила так, чтобы при регистрации документа поступления система автоматически регистрировала связанный с ним счет-фактуру на том же узле обмена.
Давайте разберем этот процесс по шагам:
ПоступлениеТоваровУслуг (или аналогичного документа поступления, используемого в вашей редакции).СчетФактураПолученный по реквизиту ДокументОснование и регистрировать его для текущего узла обмена.Пример кода для обработчика:
// Выполняем запрос для поиска подчиненных счетов-фактур
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СчетФактура.Ссылка КАК Ссылка
|ИЗ
| Документ.СчетФактураПолученный КАК СчетФактура
|ГДЕ
| СчетФактура.ДокументОснование = &Поступление
| И НЕ СчетФактура.ПометкаУдаления";
Запрос.УстановитьПараметр("Поступление", Объект.Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Переменная "Получатель" содержит узел плана обмена, для которого выполняется регистрация.
// Используем стандартный метод БСП для регистрации изменений документа.
ОбменДаннымиСобытия.ЗарегистрироватьИзмененияДокумента(Получатель, Выборка.Ссылка);
КонецЦикла;
КонецЕсли;
После написания кода сохраните правила регистрации, выгрузите их обратно в XML-файл и загрузите в настройки синхронизации вашей «1С:Розницы». Теперь при любом изменении или создании поступления связанный счет-фактура автоматически встанет в очередь на отправку.
---
Если вы не хотите усложнять таблицы регистрации изменений в базе данных и забивать их лишними записями, можно настроить правила конвертации объектов (ПКО) так, чтобы счет-фактура выгружался вместе с поступлением «прицепом».
Давайте проанализируем, как это сделать в «Конвертации данных 2.1»:
Пример программного кода для обработчика «После выгрузки»:
// Ищем связанный счет-фактуру по документу-основанию
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Ссылка КАК Ссылка
|ИЗ
| Документ.СчетФактураПолученный
|ГДЕ
| ДокументОснование = &Основание
| И НЕ ПометкаУдаления";
Запрос.УстановитьПараметр("Основание", Источник.Ссылка);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
// Принудительно выгружаем найденный объект по правилу конвертации "СчетФактураПолученный"
ВыгрузитьПоПравилу(,, Выборка.Ссылка,, "СчетФактураПолученный");
КонецЦикла;
КонецЕсли;
Преимущество метода: Документы гарантированно передаются в одном пакете обмена, а в базе-источнике не создается лишних записей регистрации изменений.
---
Если вы хотите решить задачу чисто программным путем, сохранив конфигурацию на полной поддержке и не затрагивая XML-правила обмена, идеальным решением будет использование механизма Расширений конфигурации.
Рассмотрим алгоритм реализации этого подхода:
ПоступлениеТоваровУслуг (событие ПриЗаписи).Пример кода обработчика в расширении:
Процедура Расш1_РегистрацияСчетовФактурПриЗаписиПоступления(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
// Защита от зацикливания при загрузке данных
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Находим подчиненный счет-фактуру
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Ссылка КАК Ссылка
|ИЗ
| Документ.СчетФактураПолученный
|ГДЕ
| ДокументОснование = &Основание
| И НЕ ПометкаУдаления";
Запрос.УстановитьПараметр("Основание", Источник.Ссылка);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
// Получаем нужный план обмена (например, СинхронизацияДанныхЧерезУниверсальныйФормат)
ИмяПланаОбмена = "СинхронизацияДанныхЧерезУниверсальныйФормат";
Пока Выборка.Следующий() Цикл
// Выбираем все активные узлы этого плана обмена (кроме этого узла)
ВыборкаУзлов = ПланыОбмена[ИмяПланаОбмена].Выбрать();
Пока ВыборкаУзлов.Следующий() Цикл
Если ВыборкаУзлов.Ссылка = ПланыОбмена[ИмяПланаОбмена].ЭтотУзел() Тогда
Продолжить;
КонецЕсли;
// Программная регистрация изменений для конкретного узла
ПланыОбмена.ЗарегистрироватьИзменения(ВыборкаУзлов.Ссылка, Выборка.Ссылка);
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
---
Что делать, если программировать не хочется, а зарегистрировать счета-фактуры нужно прямо сейчас «разово» или периодически вручную для большого пула документов? В БСП встроен мощный инструмент, который решает эту задачу в несколько кликов.
Давайте разберем, как воспользоваться этим функционалом:
Счет-фактура полученный.Документ-основание.Документ-основание В списке ...) или отобрать все счета-фактуры, привязанные к проведенным поступлениям за определенный период (Документ-основание.Дата Больше или равно...).Выбор конкретного варианта зависит от ваших задач. Если требуется полная автоматизация «на лету» без участия пользователей — используйте Вариант 1 или Вариант 3. Если нужно передавать документы строго парами — подойдет Вариант 2. Для ручного исправления ошибок синхронизации отлично подойдет интерактивный Вариант 4.