В типовой конфигурации «Торговля и Склад» редакции 9.2 отчет «Акт сверки» строится на основании движений по регистрам («Покупатели», «Поставщики», «Взаиморасчеты»). Это стандарт де-факто для бухгалтерского учета: нет проведенного документа — нет зафиксированной операции, а значит, нет и долга. Однако в реальной практике управленческого учета возникают ситуации, когда необходимо увидеть в акте сверки документы, которые еще не проведены (например, товар уже отгружен, но документ «распроводят» для корректировок или используют специфические схемы внутреннего учета).
В рамках данной статьи мы разберем, как технически реализовать вывод непроведенных документов в акт сверки, проанализируем сложности этого подхода и предложим оптимальный программный алгоритм для 1С 7.7.
Рассмотрим стандартный механизм работы акта сверки. Программа выполняет запрос к регистрам накопления за определенный период. Регистры в 1С 7.7 хранят информацию только о совершенных движениях, которые генерируются исключительно проведенными документами. Если документ Реализация или Поступление не проведен, в таблицах итогов и движений регистра записей о нем не существует.
Чтобы решить задачу автора, нам необходимо «смешать» данные двух типов источников:
Поскольку встроенный язык запросов 1С 7.7 («черный запрос») не поддерживает оператор UNION (объединение), который доступен в SQL, нам придется выполнять объединение на уровне программного кода, используя объект ТаблицаЗначений. Рассмотрим этот процесс пошагово.
Шаг 1. Подготовка структуры данных
Для начала создадим таблицу значений, в которую будем собирать данные из всех источников. Колонки должны соответствовать полям будущего акта сверки: Документ, Дата, СуммаПриход, СуммаРасход, Содержание.
Шаг 2. Выполнение первого запроса (по регистрам)
Выполняем штатный запрос к регистру Покупатели (или иному, используемому в вашей версии акта сверки), чтобы получить все проведенные операции и начальное сальдо. Результаты запроса выгружаем в нашу таблицу значений методом Выгрузить(ТЗ, 0, 0).
Шаг 3. Выполнение второго запроса (по непроведенным документам)
Теперь нам нужно написать запрос к метаданным документов. Проанализируем пример такого запроса:
// Создаем объект Запрос
ЗапросНепров = СоздатьОбъект("Запрос");
ТекстЗапроса = "
|Период с ДатаНач по ДатаКон;
|Док = Документ.Реализация.ТекущийДокумент,
| Документ.ПоступлениеТМЦ.ТекущийДокумент;
|Контрагент = Документ.Реализация.Контрагент,
| Документ.ПоступлениеТМЦ.Контрагент;
|Сумма = Документ.Реализация.ИтогСумма,
| Документ.ПоступлениеТМЦ.ИтогСумма;
|Статус = Документ.Реализация.Проведен,
| Документ.ПоступлениеТМЦ.Проведен;
|Группировка Док;
|Условие (Контрагент = ВыбКонтрагент);
|Условие (Статус = 0); // Выбираем только непроведенные
|";
Если ЗапросНепров.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
Шаг 4. Объединение и сортировка
После выполнения второго запроса обходим его результат в цикле и добавляем строки в основную таблицу значений ТЗ. При этом важно проверять, чтобы в таблицу не попали помеченные на удаление документы, если это не предусмотрено логикой учета.
После добавления всех данных таблицу необходимо отсортировать по дате и времени (позиции документа), чтобы акт сверки выглядел логично и хронологично:
ТЗ.Сортировать("Дата,Док");
Самая сложная часть реализации — корректный расчет входящего и исходящего остатка. Поскольку непроведенные документы не влияют на реальный остаток в регистре, нам придется вычислять остатки вручную прямо в таблице значений.
Разберем алгоритм:
ТаблицеЗначений.СуммаПриход и вычитаем СуммаРасход из текущего переменного значения сальдо.При внедрении такого решения необходимо учитывать несколько критических моментов, которые мы выясним, проанализировав специфику 1С 7.7:
1. Скорость работы. Запросы к документам (особенно по нескольким видам) работают значительно медленнее, чем запросы к регистрам. Если база большая, формирование акта сверки может занять длительное время. В таких случаях программисты рекомендуют использовать внешние компоненты, такие как 1C++, для выполнения прямых SQL-запросов к таблице журнала документов _1SJOURN.
2. Валютный учет. В непроведенном документе может быть не зафиксирован курс валюты на дату совершения операции. Если ваша конфигурация подразумевает расчеты в валюте или у.е., сумма в акте сверки может «поплыть» после проведения документа, так как при проведении курс может быть пересчитан. Рассмотрим вариант фиксации курса в шапке документа даже для непроведенных состояний.
3. Юридическая чистота. Помните, что подписанный акт сверки с непроведенными документами может стать «миной замедленного действия» при судебных разбирательствах. Рекомендуем добавлять в печатную форму примечание о том, какие документы являются плановыми или предварительными.
Вместо того чтобы захламлять систему непроведенными документами Реализация, рассмотрим более архитектурно правильный способ. В «Торговле и Складе» есть объект ЗаявкаПокупателя.
Если специфика учета вашей организации позволяет, лучше доработать акт сверки на выборку именно «Заявок», чем пытаться реанимировать данные из распроведенных документов Реализация.
Мы проанализировали ситуацию и выяснили причину, по которой автору потребовалось такое нетиповое решение — зачастую это связано с «параллельным» ведением официального и управленческого учета в одной базе. Реализация через ТаблицуЗначений является наиболее гибким и понятным способом для программиста 1С 7.7. Это позволяет сохранить структуру типового отчета, добавив в него необходимые данные без глобальной переработки конфигурации.