При переносе старых баз 1С 7.7 на новые сервера (особенно под управлением Windows Server 2003/2008/2012 и выше) разработчики часто сталкиваются с ситуацией, когда привычный функционал перестает работать. Одной из самых распространенных проблем является отказ форм, использующих внешнюю компоненту 1Cpp.dll и надстройку ТабличноеПоле. В этой статье мы подробно разберем, почему возникает ошибка при создании объекта ПоставщикДанных, и как восстановить работоспособность системы.
Рассмотрим типичную ситуацию: база перенесена, внешние компоненты 1Cpp.dll и Formex.dll отображаются в окне "Помощь -> О программе" как успешно загруженные. Однако при попытке открыть форму со списком (например, справочник контрагентов), программа выдает ошибку:
ПоставщикДанных = СоздатьОбъект("ПоставщикДанных");
ПоставщикДанных.ТипЗначений = "Справочник.КонтактыКонтрагента";
{Справочник.Контрагенты.Форма.Модуль(2336)}: Неудачная попытка создания объекта
Важно проанализировать полный текст ошибки (стек вызова), который обычно скрыт за основным сообщением. Если заглянуть глубже в логи, мы увидим следующее:
ОбъектImageListCtrl = СоздатьОбъект("MSComctlLib.ImageListCtrl");
{E:\test_base\SystemData\Classes\ПоставщикДанных\ПоставщикДанных.БиблиотекаКартинок.ert(41)}
Из этого лога мы можем сделать важный вывод: проблема заключается не в самой компоненте 1Cpp и не в лицензиях 1С, а в отсутствии в операционной системе специфического ActiveX-объекта, который используется внутри скриптов (классов) ПоставщикДанных.
Класс ПоставщикДанных — это сложная надстройка над табличным полем 1Cpp, которая автоматизирует вывод данных. Для отображения иконок (пиктограмм) в списках она обращается к стандартной библиотеке Microsoft — MSComctlLib.ImageListCtrl. Этот объект является частью библиотеки mscomctl.ocx (Common Controls 6.0).
На рабочих станциях пользователей эта библиотека часто присутствует благодаря установленным приложениям (например, MS Office или Visual Studio), но на "чистых" серверных операционных системах она по умолчанию отсутствует или не зарегистрирована. Именно поэтому у пользователей "с рабочих станций" всё работает, а "на сервере" — нет.
Самый простой, хотя и "тяжеловесный" способ решить проблему — это установка пакета Microsoft Office на сервере. При установке Office (особенно компонентов общих средств и инструментов разработки) в систему автоматически копируются и регистрируются все необходимые библиотеки ActiveX, включая mscomctl.ocx.
Рассмотрим, почему это помогает:
mscomctl.ocx в папку System32 (или SysWOW64).MSComctlLib.ImageListCtrl.СоздатьОбъект.Если установка полного пакета Office на сервер нежелательна по соображениям безопасности или лицензирования, мы можем пойти по пути точечной настройки. Нам необходимо вручную перенести и зарегистрировать библиотеку mscomctl.ocx.
Разберем этот процесс по шагам:
mscomctl.ocx на рабочей станции, где 1С работает корректно (обычно в C:\Windows\System32).C:\Windows\SysWOW64 (если сервер 64-битный) или C:\Windows\System32 (если 32-битный).regsvr32 C:\Windows\SysWOW64\mscomctl.ocx
Внимание: Простого наличия файла часто бывает недостаточно. Для программного создания объекта (через метод СоздатьОбъект в 1С) системе может потребоваться специальный ключ реестра — так называемая лицензия разработчика. Если после регистрации файла ошибка сохраняется, рекомендуется установить официальный пакет Microsoft Visual Basic 6.0 Common Controls, который легально и бесплатно добавляет эти компоненты в систему.
Если библиотеки зарегистрированы, но 1Cpp все равно не видит классы, проанализируем файл defcls.prm. Этот файл отвечает за описание классов в 1Cpp.
Проверьте следующие моменты:
defcls.prm должен находиться в корне каталога базы данных или в подкаталоге, указанном в настройках.defcls.prm должны быть относительными или соответствовать новой структуре папок на сервере.Classes (где лежат ert-файлы поставщика данных) была перенесена целиком и без потерь.На новых серверных ОС (Windows 2008 и выше) часто срабатывают механизмы защиты. Проанализируем дополнительные факторы успеха:
SystemData\Classes внутри каталога базы.1Cpp корректно прописать свои внутренние настройки в реестре.1cv7s.exe в список исключений DEP.Подводя итог: ошибка ПоставщикДанных::Неудачная попытка создания объекта почти всегда означает отсутствие системной библиотеки mscomctl.ocx. Исправив эту системную зависимость, вы восстановите работу всех табличных полей в вашей конфигурации 1С 7.7.