В практике разработчика на платформе 1С:Предприятие 7.7 иногда возникают ситуации, которые кажутся «мистическими»: программный код выполняется без ошибок, отладчик показывает верные значения переменных, но после завершения процедуры данные в базе (константы, справочники или документы) остаются прежними или «откатываются» к состоянию до начала работы алгоритма. Особенно часто это проявляется при совмещении стандартных механизмов 1С и внешних способов работы с данными, таких как OLEDB или ADO.
В данной статье мы проанализируем ситуацию, когда запись во внешний DBF-файл блокирует или отменяет изменения в основной базе ИБ, выясним причину такого поведения и рассмотрим наиболее эффективные способы работы с файлами DBF в «клюшках».
Рассмотрим типичный сценарий: процедура выполняет последовательность действий — установку значений констант, очистку и наполнение внешнего файла VO.dbf через OLEDBData, создание новых элементов справочников и финальное изменение констант. Проблема заключается в том, что после выполнения всего цикла константы возвращаются к исходным значениям, а справочники остаются пустыми, хотя система рапортует об успешном завершении.
Проанализируем причину. В 1С 7.7 (особенно в версии DBF) механизмы обеспечения целостности данных жестко завязаны на транзакционную модель. Если в коде была вызвана функция НачатьТранзакцию(), но по какой-то причине не была вызвана ЗафиксироватьТранзакцию(), или произошел неявный откат, все изменения, внесенные объектами 1С (справочники, константы, документы), будут аннулированы.
Основная причина: Забытая или «потерянная» транзакция. При спешном написании кода разработчик может открыть транзакцию и забыть ее закрыть, либо условие закрытия транзакции не срабатывает из-за логической ошибки. В этом случае 1С откатывает все изменения в файлах базы данных (.dbf) при завершении работы процедуры или закрытии соединения.
Важно понимать, как работают транзакции в файловой версии 7.7. Когда мы вызываем НачатьТранзакцию(), движок CodeBase (на котором построена 1С 7.7) начинает отслеживать изменения. Физически это часто сопровождается созданием временных файлов и блокировками в файловой системе. Если в этот момент внешнее приложение или объект (например, через ADODB.Connection) пытается вносить изменения в файлы, находящиеся в том же каталоге, может возникнуть конфликт доступа.
Рассмотрим правильную структуру кода с использованием транзакции:
Процедура ЗагрузкаДанных()
НачатьТранзакцию();
Попытка
// Устанавливаем константы
Константа.ДатаЗагрузки = ТекущаяДата();
// Работа с внешним DBF через OLEDB
// ... код работы с OLEDB ...
// Создание справочников
Спр = СоздатьОбъект("Справочник.Номенклатура");
// ... логика создания ...
ЗафиксироватьТранзакцию();
Сообщить("Данные успешно загружены и зафиксированы.");
Исключение
ОтменитьТранзакцию();
Сообщить("Произошла ошибка, изменения откачены: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
В сообществе 1С часто ведется спор: что быстрее и надежнее для работы с DBF? Рассмотрим плюсы и минусы каждого подхода.
1. Стандартный объект XBase
Это встроенный механизм 1С. Он максимально совместим с форматом таблиц, которые использует сама платформа.
.cdx, наличие метода Сжать() (Pack), корректная работа с кодировками (DOS/Windows).2. Работа через OLEDB / ADO
Позволяет использовать SQL-запросы к DBF-файлам.
INSERT INTO... SELECT или UPDATE).DELETE только помечает запись как удаленную, файл не уменьшается в размере).Если вы все же решили использовать OLEDB для работы с DBF в 1С 7.7, проанализируем выбор драйвера. Стандартный Microsoft Jet 4.0 OLE DB Provider часто работает медленно и некорректно обрабатывает структуру таблиц 1С.
Специалисты рекомендуют использовать Microsoft OLE DB Provider for Visual FoxPro (VFPOLEDB). Разберем пример инициализации такого соединения:
Conn = СоздатьОбъект("ADODB.Connection");
Conn.ConnectionString = "Provider=VFPOLEDB.1;Data Source=C:\MyBase\Data\;Collating Sequence=MACHINE";
Попытка
Conn.Open();
// Выполнение SQL запроса
Conn.Execute("INSERT INTO VO (NAME, PRICE) VALUES ('Товар 1', 100)");
Conn.Close();
Исключение
Сообщить("Ошибка подключения: " + ОписаниеОшибки());
КонецПопытки;
Если производительность штатного XBase вас не устраивает, а OLEDB кажется слишком громоздким и «глючным», проанализируем профессиональные инструменты, которые де-факто стали стандартом для «клюшек» в последние годы:
Выясним главные правила, которые помогут избежать «мистики» с пропажей данных:
НачатьТранзакцию() и ЗафиксироватьТранзакцию(). Любое прерывание процедуры (например, через Возврат) внутри открытой транзакции приведет к откату данных.\ExtData\), а не в корне каталога информационной базы. Это предотвратит конфликты при выполнении регламентных операций 1С (тестирование и исправление, упаковка).1С++, а для простых операций с небольшими файлами — штатному объекту XBase, так как он наиболее предсказуем.Соблюдение этих принципов позволит сделать вашу работу с 1С 7.7 стабильной и эффективной, несмотря на почтенный возраст платформы.