При разработке интеграций между 1С 7.7 (конфигурация «Торговля и Склад 9.2») и внешними системами (например, на .NET или Java) программисты часто сталкиваются с ситуацией, когда созданный программно документ не формирует ожидаемых движений. Одной из самых распространенных проблем является проведение банковских документов (СтрокаВыпискиПриход и СтрокаВыпискиРасход). Рассмотрим ситуацию: вы создали документ, заполнили основные поля, вызвали метод Провести(), но в итоге увидели движения только по регистру «Банк», в то время как взаиморасчеты с поставщиками или покупателями остались нетронутыми.
В этой статье мы подробно разберем, почему так происходит, какие скрытые механизмы платформы 1С 7.7 влияют на результат проведения и как правильно инициализировать объекты для полноценного учета.
Прежде всего, проанализируем, как работает алгоритм проведения внутри типовой конфигурации. В 1С 7.7 логика проведения описывается в модуле документа в предопределенной процедуре ОбработкаПроведения. В ТиС 9.2 для банковских строк эта процедура содержит разветвленную логику, зависящую от реквизита КодОперации.
Давайте посмотрим на упрощенный фрагмент кода из модуля документа:
Если КодОперации <> глКО.Прочее Тогда
ОбработкаПроведенияПоВзаиморасчетам();
Иначе
ОбработкаПроведенияПрочее();
КонецЕсли;
Разберем, что здесь происходит. Глобальная переменная глКО — это структура (или объект), содержащая предопределенные коды хозяйственных операций. Если вы не установили КодОперации или установили его в значение «Прочее», система выполнит только базовые движения по банку. Для того чтобы документ затронул регистры «Покупатели» или «Поставщики», необходимо выбрать корректную операцию, например, «Оплата поставщику» или «Оплата от покупателя».
Выясним причину, по которой программное проведение может давать сбои при вызове из внешних сред через OLE/COM. Когда вы подключаетесь к 1С 7.7 программно, процедура ПриНачалеРаботыСистемы может выполняться не полностью. В результате глобальные переменные, такие как глКО, могут оказаться пустыми.
Если в коде проведения встречается проверка Если КодОперации = глКО.ОплатаПоставщику, а глКО.ОплатаПоставщику не инициализирована, условие никогда не выполнится. Перед началом работы через OLE убедитесь, что все необходимые справочники и константы загружены в память.
Проанализируем ситуацию далее. Даже если КодОперации заполнен верно, движения по взаиморасчетам могут не появиться. В ходе обсуждения на форумах выяснилось, что в ТиС 9.2 за проведение по регистрам долгов отвечает отдельный реквизит — СуммаВзаиморасчетов.
Важный момент: в 1С 7.7 сумма документа и сумма взаиморасчетов — это разные поля. Это связано с тем, что расчеты могут вестись в одной валюте (например, USD), а оплата проходить в другой (например, RUB). При интерактивном вводе (через форму) 1С автоматически пересчитывает эти значения. При программном создании документа это ваша обязанность.
Рассмотрим пример правильного заполнения реквизитов документа при программном создании:
Док = СоздатьОбъект("Документ.СтрокаВыпискиРасход");
Док.Новый();
Док.ДатаДок = ТекущаяДата();
Док.Контрагент = ВыбранныйКонтрагент;
Док.Договор = ВыбранныйДоговор;
Док.Сумма = 1000; // Сумма платежа в валюте счета
Док.СуммаВзаиморасчетов = 1000; // Сумма, которая пойдет в регистр взаиморасчетов
Док.КодОперации = глКО.ОплатаПоставщику;
Док.Записать();
Док.УстановитьВремя(12, 0, 0); // Устанавливаем время для корректной последовательности
Док.Провести();
Посмотрим на ошибку, с которой столкнулся автор темы: «Движения регистров не могут выполняться у данного объекта». Эта ошибка возникает, когда разработчик пытается вызвать процедуру ОбработкаПроведенияПоВзаиморасчетам() напрямую из глобального модуля или внешнего кода.
В 1С 7.7 объект Регистр доступен для записи только внутри контекста штатной процедуры ОбработкаПроведения, когда документ находится в состоянии «Проведение». Вызов внутренних функций модуля документа «снаружи» не переводит документ в этот режим. Единственный правильный путь — заполнить все реквизиты и вызвать штатный метод Провести().
Разберем по шагам правильный алгоритм программной интеграции:
Контрагента, но и Договор. В ТиС 9.2 именно договор определяет, как закроется задолженность (по договору в целом или по счетам).глКО.СуммаВзаиморасчетов. Если она будет равна нулю, регистр взаиморасчетов не изменится, хотя остаток на банковском счете уменьшится.СтавкаНДС и СуммаНДС.Записать(), затем УстановитьВремя() (чтобы платеж не оказался «раньше» счета по времени внутри одного дня), и только потом Провести().Проанализируем еще один совет из обсуждения. В типовой конфигурации «Торговля и Склад» уже существует встроенная обработка для загрузки данных из клиент-банков. Она называется ПредприятиеКлиент.
Если ваша задача — просто загрузить выписки, возможно, проще генерировать файл в формате 1C_to_KL.txt из вашей внешней системы и скармливать его стандартной обработке 1С. Это гарантирует, что все реквизиты будут заполнены так, как этого ожидает разработчик конфигурации, и все проверки (на ИНН, расчетные счета и т.д.) отработают корректно.
Работа с 1С 7.7 требует глубокого понимания того, как визуальные формы взаимодействуют с данными. Многие действия, которые кажутся «автоматическими» при работе пользователя, на самом деле зашиты в обработчики событий формы. При программном создании документа эти обработчики не вызываются, поэтому программист должен вручную инициализировать каждый значимый реквизит, включая СуммаВзаиморасчетов и КодОперации.
Соблюдение этих правил позволит вам создавать надежные интеграции и обеспечит целостность управленческого учета в системе.