Как программно провести банковскую выписку в 1С 7.7 с отражением во взаиморасчетах?

Программист 1С v7.7 Управленческий учет IT и автоматизация бизнеса
← На главную

При разработке интеграций между 1С 7.7 (конфигурация «Торговля и Склад 9.2») и внешними системами (например, на .NET или Java) программисты часто сталкиваются с ситуацией, когда созданный программно документ не формирует ожидаемых движений. Одной из самых распространенных проблем является проведение банковских документов (СтрокаВыпискиПриход и СтрокаВыпискиРасход). Рассмотрим ситуацию: вы создали документ, заполнили основные поля, вызвали метод Провести(), но в итоге увидели движения только по регистру «Банк», в то время как взаиморасчеты с поставщиками или покупателями остались нетронутыми.

В этой статье мы подробно разберем, почему так происходит, какие скрытые механизмы платформы 1С 7.7 влияют на результат проведения и как правильно инициализировать объекты для полноценного учета.

Анализ механизмов проведения в «Торговле и Складе 9.2»

Прежде всего, проанализируем, как работает алгоритм проведения внутри типовой конфигурации. В 1С 7.7 логика проведения описывается в модуле документа в предопределенной процедуре ОбработкаПроведения. В ТиС 9.2 для банковских строк эта процедура содержит разветвленную логику, зависящую от реквизита КодОперации.

Давайте посмотрим на упрощенный фрагмент кода из модуля документа:


Если КодОперации <> глКО.Прочее Тогда
    ОбработкаПроведенияПоВзаиморасчетам(); 
Иначе
    ОбработкаПроведенияПрочее();
КонецЕсли;

Разберем, что здесь происходит. Глобальная переменная глКО — это структура (или объект), содержащая предопределенные коды хозяйственных операций. Если вы не установили КодОперации или установили его в значение «Прочее», система выполнит только базовые движения по банку. Для того чтобы документ затронул регистры «Покупатели» или «Поставщики», необходимо выбрать корректную операцию, например, «Оплата поставщику» или «Оплата от покупателя».

Проблема инициализации глобальных переменных при OLE-соединении

Выясним причину, по которой программное проведение может давать сбои при вызове из внешних сред через OLE/COM. Когда вы подключаетесь к 1С 7.7 программно, процедура ПриНачалеРаботыСистемы может выполняться не полностью. В результате глобальные переменные, такие как глКО, могут оказаться пустыми.

Если в коде проведения встречается проверка Если КодОперации = глКО.ОплатаПоставщику, а глКО.ОплатаПоставщику не инициализирована, условие никогда не выполнится. Перед началом работы через OLE убедитесь, что все необходимые справочники и константы загружены в память.

Критический реквизит: СуммаВзаиморасчетов

Проанализируем ситуацию далее. Даже если КодОперации заполнен верно, движения по взаиморасчетам могут не появиться. В ходе обсуждения на форумах выяснилось, что в ТиС 9.2 за проведение по регистрам долгов отвечает отдельный реквизит — СуммаВзаиморасчетов.

Важный момент: в 1С 7.7 сумма документа и сумма взаиморасчетов — это разные поля. Это связано с тем, что расчеты могут вестись в одной валюте (например, USD), а оплата проходить в другой (например, RUB). При интерактивном вводе (через форму) 1С автоматически пересчитывает эти значения. При программном создании документа это ваша обязанность.

Рассмотрим пример правильного заполнения реквизитов документа при программном создании:


Док = СоздатьОбъект("Документ.СтрокаВыпискиРасход");
Док.Новый();
Док.ДатаДок = ТекущаяДата();
Док.Контрагент = ВыбранныйКонтрагент;
Док.Договор = ВыбранныйДоговор;
Док.Сумма = 1000; // Сумма платежа в валюте счета
Док.СуммаВзаиморасчетов = 1000; // Сумма, которая пойдет в регистр взаиморасчетов
Док.КодОперации = глКО.ОплатаПоставщику;
Док.Записать();
Док.УстановитьВремя(12, 0, 0); // Устанавливаем время для корректной последовательности
Док.Провести();

Почему нельзя просто вызвать внутренние процедуры модуля?

Посмотрим на ошибку, с которой столкнулся автор темы: «Движения регистров не могут выполняться у данного объекта». Эта ошибка возникает, когда разработчик пытается вызвать процедуру ОбработкаПроведенияПоВзаиморасчетам() напрямую из глобального модуля или внешнего кода.

В 1С 7.7 объект Регистр доступен для записи только внутри контекста штатной процедуры ОбработкаПроведения, когда документ находится в состоянии «Проведение». Вызов внутренних функций модуля документа «снаружи» не переводит документ в этот режим. Единственный правильный путь — заполнить все реквизиты и вызвать штатный метод Провести().

Пошаговая инструкция для корректного проведения

Разберем по шагам правильный алгоритм программной интеграции:

  1. Заполнение аналитики: Обязательно укажите не только Контрагента, но и Договор. В ТиС 9.2 именно договор определяет, как закроется задолженность (по договору в целом или по счетам).
  2. Установка кода операции: Используйте значения из справочника «Хозяйственные операции», которые соответствуют глКО.
  3. Заполнение сумм: Не забывайте про СуммаВзаиморасчетов. Если она будет равна нулю, регистр взаиморасчетов не изменится, хотя остаток на банковском счете уменьшится.
  4. Учет НДС: Для корректного формирования книги покупок/продаж заполните реквизиты СтавкаНДС и СуммаНДС.
  5. Запись и время: Сначала вызывайте Записать(), затем УстановитьВремя() (чтобы платеж не оказался «раньше» счета по времени внутри одного дня), и только потом Провести().

Альтернативные способы загрузки

Проанализируем еще один совет из обсуждения. В типовой конфигурации «Торговля и Склад» уже существует встроенная обработка для загрузки данных из клиент-банков. Она называется ПредприятиеКлиент.

Если ваша задача — просто загрузить выписки, возможно, проще генерировать файл в формате 1C_to_KL.txt из вашей внешней системы и скармливать его стандартной обработке 1С. Это гарантирует, что все реквизиты будут заполнены так, как этого ожидает разработчик конфигурации, и все проверки (на ИНН, расчетные счета и т.д.) отработают корректно.

Заключение

Работа с 1С 7.7 требует глубокого понимания того, как визуальные формы взаимодействуют с данными. Многие действия, которые кажутся «автоматическими» при работе пользователя, на самом деле зашиты в обработчики событий формы. При программном создании документа эти обработчики не вызываются, поэтому программист должен вручную инициализировать каждый значимый реквизит, включая СуммаВзаиморасчетов и КодОперации.

Соблюдение этих правил позволит вам создавать надежные интеграции и обеспечит целостность управленческого учета в системе.

← На главную