При использовании внешней компоненты для прямого доступа к базе данных 1С 7.7 часто возникают трудности с получением актуальных остатков. Основные проблемы связаны с особенностями хранения данных в таблицах DBF, необходимостью точного соблюдения типов данных при передаче параметров и сложностью индексов в регистрах 1С. Разберем по шагам, как настроить корректное получение остатков.
Чаще всего при выполнении запроса разработчик получает 0 или пустую таблицу. Основные причины:
char(9)). Если при передаче параметра в ДобПараметр или УстПараметр указать неверную длину или тип, SQL-сервер не найдет соответствие в базе данных.WHERE, иначе SQL-сервер не использует индексы, что приводит либо к ошибкам, либо к катастрофическому падению производительности.$РегистрИтоги.Для стабильной работы рекомендуется использовать компоненту 1С++ и обращаться к таблицам итогов. Рассмотрим пример кода для получения остатка по конкретной номенклатуре на текущую дату.
Первым делом настроим подключение к базе данных. Использование OLEDBData в сочетании с провайдером VFPOLEDB позволяет гибко работать с DBF-файлами.
Процедура ПриОткрытии()
ЗагрузитьВнешнююКомпоненту(КаталогИБ()+"1cpp.dll");
ОлеДБ = СоздатьОбъект("OLEDBData");
Соединение = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ() + ";Mode=ReadWrite;Collating Sequence=MACHINE";
Рез = ОлеДБ.Соединение(Соединение);
Запрос = ОлеДБ.СоздатьКоманду();
Запрос.Выполнить("EXECSCRIPT('SET ANSI OFF')");
КонецПроцедуры
Наиболее эффективный способ получения данных — обращение к таблице итогов через DTOS. Это позволяет сформировать компактное выражение для поиска по индексу. Рассмотрим, как это реализовать:
ТекстЗапроса = "
|SELECT
| $Итоги.Количество КонОст
|FROM
| $РегистрИтоги.ОстаткиТМЦ Итоги
|WHERE
| DTOS(Итоги.period) + $Итоги.Номенклатура = (DTOS(:ПредПериод) + :Номенклатура)
|";
мд = СоздатьОбъект("MetaDataWork");
НачПериод = мд.ПолучитьНачПериода(ПолучитьДатуТА());
Запрос.УстановитьТекстовыйПараметр("ПредПериод", НачПериод);
Запрос.УстановитьТекстовыйПараметр("Номенклатура", Ном.ТекущийЭлемент());
ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
Проанализируем ситуацию: стоит ли выполнять запрос в цикле? Однозначный ответ — нет. Использование прямого запроса внутри цикла подбора товаров приводит к множественным сетевым обращениям, что значительно замедляет интерфейс программы.
Вместо этого рекомендуем следующие подходы:
ТаблицуЗначений. Поиск по ТЗ (или ИТЗ) происходит практически мгновенно.УложитьСписокОбъектов для передачи большого массива идентификаторов в SQL, а затем выполните один групповой SELECT.MetaDataWork для определения границ периодов. Это гарантирует, что запрос будет обращаться именно к тому периоду, в котором хранятся актуальные остатки регистра.Таким образом, успех при работе с прямыми запросами в 1С 7.7 строится на трех китах: правильной подготовке параметров, использовании таблиц итогов вместо движений и минимизации количества запросов к серверу за счет пакетной обработки данных.