1C 77
Андрей Егоров где-то в 2001 Примечание большая часть написанного здесь текста с примерами взята по памяти (пару лет назад изучал вопрос достаточно подробно, поэтому что-то в алгоритмах может и не работать я ведь их не копировал откуда-то, а прямо тут же и писал, так что за синтаксические ошибки не пинайте). На данный момент я активно OLE не пользуюсь (не из-за каких-то проблем с самим OLE, а из-за отсутствия надобности в нём в текущий момент).
Основные преимущества, благодаря которым OLE активно используется в работе с V7:
- Для вызывающей базы по барабану какой тип имеет вызываемая база (DBF или SQL)
- Объектами вызываемой базы можно управлять практически всеми известными методами работы с объектами V7 (т.е. со справочниками работают методы справочников, с документами методы документов, и т.д.). Соответственно, можно напрямую решить стоит отрабатывать конкретные объекты вызываемой базы, или же пропустить их.
1. Присоединение к базе V7 через OLE.
БазаОле=СоздатьОбъект(«V77.Application»);
// Получаем доступ к OLE объекту V7
Очень важно знать, какая версия V7 установлена на компьютере (локальная, сетевая или SQL), так как каждая из них прописывает в реестре свое значение ключа для запуска через OLE:
- Локальная версия (на одного пользователя): V77L.Application
- Сетевая версия: V77.Application
Версия SQL: V77S.Application
Далее, вместо термина «вызываемая база» будет написано просто «база OLE», а вместо термина «вызывающая база» «местная база».
Теперь, мы должны знать несколько параметров для запуска базы OLE: каталог базы, имя пользователя и пароль. Ну, наверное, ещё понадобится возможность запустить базу OLE в монопольном режиме ;-).
Запускаем базу следующим образом:
Комментарий: функции СокрЛП() указаны в примере на тот случай, если пользователь захочет указанные выше переменные сделать реквизитами диалога (проблема при этом состоит в том, что в алгоритм программа передаст полное значение реквизита, т.е. допишет в конце значения то количество пробелов, которое необходимо для получения полной длины строки, указанной в свойствах реквизита диалога).
2. Доступ к объектам базы OLE
Запомните на будущее как непреложный факт:
- Из местной базы в базу OLE (и, соответственно, наоборот) напрямую методом присвоения можно перенести только числовые значения, даты и строки ограниченной длины. Т.е. местная база «поймет» прекрасно без дополнительных алгоритмов преобразования полученного значения только простые типы значений. Кроме того, под ограничением строк подразумевается проблемы с пониманием в местной базе реквизитов объектов базы OLE типа Строка неограниченной длины. К этому же еще надо добавить и периодические реквизиты. Естественно, под методом присвоения подразумеваются и попытки сравнения объектов из разных баз.
- Есть проблемы при попытке перенести пустую дату OLE может ее конвертировать, например, в 31.12.1899 и т.п. Поэтому вам лучше заранее выяснить те значения, которые могут появится в местной базе при переносе пустых дат, чтобы предусмотреть условия преобразования их в местной базе.
Доступ к константам базы OLE
ЗначениеКонстантыOLE = БазаОле.Константа.ДатаЗапретаРедактирования;
Доступ к справочникам и документам базы OLE (через функцию CreateObject)
После создания объекта справочника или документа к нему применимы все методы касающиеся соответствующего объекта V7:
СпрОле.ВыбратьЭлементы();
Пока СпрОле.ПолучитьЭлемент() Цикл
Сообщить(Спр.Наименование);
КонецЦикла;
Заметьте, что если В операторе Сообщить вместо Спр.наименование вы укажете Спр.ТекущийЭлемент(), то вместо строкового или числового представления этого элемента программа выдаст просто «OLE». Именно это я и имел в виду, когда говорил, что напрямую мало что можно вызвать.
Гарантированно не будут работать методы ТекущийЭлемент() и ТекущийДокумент() (ошибки V7 не будет, но и результат работы будет нулевой). Рассмотрим следующий пример:
Отсюда вывод: возможность доступа к объектам базы V7 через OLE требуется, в основном, только для определенной задачи получить доступ к реквизитам определенного элемента справочника или документа.
Однако не забываем, что объекты базы OLE поддерживают все методы работы с ними, в том числе и Новый(). Приведем пример, противоположный предыдущему:
Доступ к регистрам базы OLE: не сложнее справочников и документов
Доступ к перечислениям базы OLE (аналогичен константе)
ЗначениеПеречисленияOLE = БазаОле.Перечисление.Булево.НеЗнаю; // 😉
Заметьте, что пользы для местной базы от переменной ЗначениеПеречисленияOLE особо-то и нет, ведь, подобно справочнику и документу, перечисление также напрямую недоступно для местной базы.
Пожалуй, пример работы с ними может быть следующим (в качестве параметра условия):
Доступ к счетам базы OLE
СчтОле=БазаОле.CreateObject(«Счет»);
СчтОле.НайтиПоКоду(«10.5»);
// нашли в базе OLE счет 10.5
Доступ к ВидамСубконто базы OLE (аналогичен перечислению)
ВидСубконтоКонтрагентыОле = БазаОле.ВидыСубконто.Контрагенты;
По аналогии со справочниками и документами работает объект Периодический, план счетов работает по аналогии с ВидомСубконто, ну и далее в том же духе.
Отдельную главу посвятим запросу, а сейчас стоп. Самое-то главное забыли!
Доступ к функциям и процедурам глобального модуля базы OLE
Как же я про это забыл-то, а? Поскольку при запуске базы автоматически компилируется глобальный модуль, то нам становятся доступны его функции и процедуры (поправлюсь только те, у которых выставлена опция Экспорт). Плюс к ним еще и различные системные функции V7. А доступны они нам через функцию V7 EvalExpr(). Приведем примеры работы с базой OLE:
На самом деле, в последней строке примера я исхитрился и забежал немного вперед. Дело в том, что как и запрос (см. отдельную главу), так и EvalExpr() выполняются внутри базы OLE, причем команды передаются им строкой, и поэтому приходится ломать голову, как передать им необходимые значения объектов базы OLE в строке, сформированной в местной базе.
3. Алгоритмы преобразования объектов в удобоваримый вид между базами
Ясно, что алгоритмы преобразования нужны не только для переноса объектов в между и базами, но и для такой простой задачи, как попытки сравнить их между собой. И еще раз обращу внимание: ОБЪЕКТЫ ОДНОЙ БАЗЫ ПРЕКРАСНО ПОНИМАЮТ ДРУГ ДРУГА, ПРОБЛЕМЫ ВОЗНИКАЮТ ТОЛЬКО КОГДА ВЫ НАЧИНАЕТЕ СВЯЗЫВАТЬ МЕЖДУ СОБОЙ ОБЪЕКТЫ РАЗНЫХ БАЗ.
Команда
ДокОле.Фирма=СпрОле.ТекущийЭлемент();
// где ДокОле документ базы OLE,
// a СпрОле справочник «Фирмы» базы OLE
будет прекрасно работать без ошибок. Не забывайте это, чтобы не перемудрить с алгоритмами!
Итак, повторяюсь, что и перенести напрямую, и просто сравнить можно только даты (причем не пустые), числа и строки ограниченной длины. Вопрос как же нам сравнить агрегатные объекты из разных баз (не числа, не даты и не строки), т.е. как их преобразовать в эту самую строку/число/дату?.
Преобразование справочников и документов базы OLE (если есть аналоги в местной базе).
В принципе, преобразование их было уже рассмотрено в примерах выше и сводится к поиску их аналогов в местной базе. Могу еще раз привести пример, заодно с использованием регистров:
Преобразование перечислений и видов субконто (подразумевается, что в обоих базах есть аналоги)
Вся задача сводится к получению строкового или числового представления перечисления или вида субконто. Не поймите это как прямую команду воспользоваться функцией Строка() или Число() ;-). Нет. Для этого у нас есть обращение к уникальному представлению перечисления и вида субконто метод Идентификатор() или ЗначениеПоНомеру(). Второй вариант не очень подходит, так как зачастую в разных базах даже перечисления бывают расположены в другом порядке, а вот идентификаторы стараются держать одинаковыми в разных базах. Отсюда вывод, пользуйтесь идентификаторами. Кстати, не путайте вид субконто с самим субконто! Привожу пример преобразования:
То же самое относится и к плану счетов принцип работы с ним тот же, что и для вида субконто.
Преобразование счетов
Во многом объект Счет аналогичен объекту Справочник. Отсюда и пляшем:
Наверное, по преобразованию объектов уже хватит.
4. Работа с запросами и EvalExpr()
Наконец-то добрались и до запросов. Надо пояснить несколько вещей, касаемых запросов (да и EvalExpr() тоже). Самое главное компиляция текста OLE-запроса (т.е. разбор всех переменных внутри запроса), как и сами OLE-запросы, выполняются внутри базы OLE и поэтому ни одна переменная, ни один реквизит местной базы там недоступны. Да и сам запрос даже не подозревает, что его запускают по OLE из другой базы! Поэтому, чтобы правильно составить текст, иногда требуется не только обдумать, как передать параметры запроса в базу OLE, но и обдумать, что нужно добавить в глобальный модуль той самой базы OLE, чтобы как-то собрать для запроса переменные!
- Поскольку сам текст запроса и функции EvalExpr() является по сути текстом, а не набором параметров, то напрямую передать ему ссылку на элемент справочника, документ, счет и т.п. нельзя. Исключение может быть составлено для конкретных значений перечислений, видов субконто, констант, планов счетов и т.п.
- Хоть и многим и так понятно, что я скажу дальше, но я все-таки уточню: при описании переменных в тексте запроса не забывайте, что объекты базы надо указывать напрямую, без всяких префиксов типа БазаОле.
- Отрабатывать запрос сложно тем, что ошибки, например, при компиляции напрямую не увидеть. Поэтому начинаем пошагово готовится к отработке запроса в базе OLE.
Вначале допишем в глобальном модуле базы OLE несколько строк, которые нам помогут в работе:
Теперь начинаем потихоньку писать сам запрос. Что мы имеем? В форме диалога местной базы есть несколько реквизитов диалога (либо это будут местные переменные):
Мы начинаем писать запрос и сразу попадаем в этакую ловушку:
ТекстЗапроса = » Период с Начдата по КонДата; «;
Вроде все в порядке, но такой запрос не выполнится в базе OLE, так как там понятия не имеют, что такое НачДата и КонДата. Ведь эти переменные действительны только для местной базы! Переписываем запрос заново:
Так… Дошли до условий отбора в запросе. Рассмотрим два варианта, когда выбран ВыбТовар:
Казалось бы все очень просто. По аналогии если уникальность для товаров ведется по наименованию, то простой заменой слова «код» на слово «наименование» мы решаем вопрос и здесь. Теперь рассмотрим, когда мы выбрали группу, т.е. текст условия должен будет выглядеть так:
| Условие (товар.ПринадлежитГруппе(КакаяТоГруппа)=1);
Правда, и здесь можно проблему решить двумями путями ;-). Первый путь когда мы имеем дело с двухуровневым справочником. Тогда проблема группы решается так же просто, как и в первом варианте:
А если справочник очень даже многоуровневый? Вот для этого мы и используем написанную ранее
функцию. Предположим, что список значений запроса с индексом массива 1 мы будем использовать
для хранения подобных значений (например, хранить в нем группы товаров, клиентов) для
хитрых условий. Итак, например, в ВыбТовар у нас указана группа товаров, а в
ВыбКлиент группа клиентов, которым мы товары группы ВыбТовар продавали.
Кроме того, мы должны пропустить накладные возвратов поставщикам, и не забыть, что товары
надо еще и отбирать по флажку ТолькоЗамерзающийЗимойТовар:
Уфф. Вроде все. Остается только запустить запрос:
Ну, а с реквизитами запроса разбираемся так же, как указано было выше в предыдущих разделах. И не забываем, что кроме хранения конкретных значений можно использовать другие списки значений запроса. Например, можно заполнить какой-либо список значений запроса списком клиентов и использовать его в запросе:
Что осталось за бортом
Перенос реквизитов неограниченной длины, работа с периодическими реквизитами.
ГРОМАДНЕЙШИЕ ИЗВИНЕНИЯ ЗА ВОЗМОЖНЫЕ СИНТАКСИЧЕСКИЕ И ОРФОГРАФИЧЕСКИЕ ОШИБКИ В ДОКУМЕНТЕ ПИСАЛ БЕЗ ПРОВЕРКИ В V7, БОЛЬШУЮ ЧАСТЬ ПО ПАМЯТИ.
ЕСЛИ ОБНАРУЖИТЕ ОШИБКИ, ДА И ВООБЩЕ, ЕСЛИ ЕСТЬ ВОПРОСЫ ПО OLE ПИШИТЕ. ЕСЛИ ВЫКРОЮ ВРЕМЯ, ТО ПОИЩУ РЕШЕНИЕ.
-
Содержание
- Установка в Windows х32
- «C:\Program Files (x86)\» 32-х разрядной системы в
- «C:\Documents and Settings\All Users\Главное меню\Программы»
- «C:\ProgramData\Microsoft\Windows\Start Menu\Programs»
- (пути могут различаться, в зависимости от используемых версий Windows).
- «C:\Windows\SysWOW64\» 64-х разрядной операционной системы.
- Отключение DEP для процесса 1cv7.exe (для серверных ОС)
- Далее надо исключить процесс 1cv7.exe из проверки DEP, для этого заходим в свойства системы ( «Пуск» — «Панель управления» — «Система и безопасность» — «Система» ) и выбираем «Дополнительные параметры системы» .
- Далее переходим на вкладку «Предотвращение выполнения данных» , нажимаем кнопку «Добавить» и выбираем файл «C:\Program Files (x86)\1Cv77\BIN\1cv7s.exe» , который мы скопировали в шаге 1.
- Установка драйверов защиты
- Теперь необходимо установить драйвера защиты. 1С:Предприятие использует аппаратно-программную систему защиты HASP от Aladdin Knowledge Systems Ltd. Для запуска всех модулей защиты необходимо:
- Вставить электронный ключ HASP в USB или LPT порт компьютера, в зависимости от типа ключа.
- Установить драйвер ключа HASP4 для Windows, следуя инструкциям инсталлятора. Скачать можно с официально сайта или с текущего.
- Установить менеджер лицензий HASP4 для Windows, следуя инструкциям инсталлятора. Скачать можно с официально сайта или с текущего. Устанавливать менеджер необходимо как сервис, выбрав «Service (nhsrvice.exe)» во время установки.Если у вас Windows 10 то выйдет ошибка, просто нажмите Выполнить в любом случае.
- Запустить ярлык «Установка драйвера защиты» , находящийся по пути «Пуск» — «Все программы» — «1С Предприятие 7.7» .
- Дождаться сообщения об успешной установке драйвера и перезагрузить компьютер.
- Изменение порядка сортировки ИБ
- Исправляем ошибку «Порядок сортировки, установленный для базы данных, отличается от системного!» если такая ошибка имеет место быть при запуске «1С:Предприятие».
- Запуск 1С:Предприятие
- Синтаксис
- Параметры
- Возвращаемое значение
- Описание
- Пример использования
Установка в Windows х32
-
«C:\Program Files (x86)\» 32-х разрядной системы в
-
«C:\Documents and Settings\All Users\Главное меню\Программы»
«C:\ProgramData\Microsoft\Windows\Start Menu\Programs»
(пути могут различаться, в зависимости от используемых версий Windows).
-
«C:\Windows\SysWOW64\» 64-х разрядной операционной системы.
-
Отключение DEP для процесса 1cv7.exe (для серверных ОС)
Далее надо исключить процесс 1cv7.exe из проверки DEP, для этого заходим в свойства системы ( «Пуск» — «Панель управления» — «Система и безопасность» — «Система» ) и выбираем «Дополнительные параметры системы» .
Далее переходим на вкладку «Предотвращение выполнения данных» , нажимаем кнопку «Добавить» и выбираем файл «C:\Program Files (x86)\1Cv77\BIN\1cv7s.exe» , который мы скопировали в шаге 1.
-
Установка драйверов защиты
Теперь необходимо установить драйвера защиты. 1С:Предприятие использует аппаратно-программную систему защиты HASP от Aladdin Knowledge Systems Ltd. Для запуска всех модулей защиты необходимо:
-
-
Вставить электронный ключ HASP в USB или LPT порт компьютера, в зависимости от типа ключа.
-
Установить драйвер ключа HASP4 для Windows, следуя инструкциям инсталлятора. Скачать можно с официально сайта или с текущего.
-
-
Установить менеджер лицензий HASP4 для Windows, следуя инструкциям инсталлятора. Скачать можно с официально сайта или с текущего. Устанавливать менеджер необходимо как сервис, выбрав «Service (nhsrvice.exe)» во время установки.Если у вас Windows 10 то выйдет ошибка, просто нажмите Выполнить в любом случае.
-
Запустить ярлык «Установка драйвера защиты» , находящийся по пути «Пуск» — «Все программы» — «1С Предприятие 7.7» .
-
Дождаться сообщения об успешной установке драйвера и перезагрузить компьютер.
-
Изменение порядка сортировки ИБ
Исправляем ошибку «Порядок сортировки, установленный для базы данных, отличается от системного!» если такая ошибка имеет место быть при запуске «1С:Предприятие».
-
Запуск 1С:Предприятие
Функция определяет, является ли пустым переданное значение
Синтаксис
Функция ПустоеЗначение() имеет следующий синтаксис:
число ПустоеЗначение(Значение)
А также альтернативный англоязычный синтаксис:
numeric EmptyValue(Value)
Параметры
Описание параметров функции ПустоеЗначение():
Имя параметра | Тип | Описание |
---|---|---|
Значение | Произвольный | выражение произвольного типа |
Жирным шрифтом выделены обязательные параметры |
Возвращаемое значение
Число
Варианты возвращаемых значений:
1 | — значение пустое |
0 | — значение не пустое |
Описание
Функция ПустоеЗначение() определяет, является ли пустым переданное значение.
При этом применяются следующие правила:
- значение неопределенного типа — всегда пустое;
- значение типа «строка» проверяется как в функции ПустаяСтрока();
- значение типа «число» проверяется на равенство нулю;
- значение типа «дата» проверяется на пустое значение ‘ . . ‘;
- значения следующих типов: «Справочник», «Перечисление», «Документ», «Счет», «Вид субконто», «План счетов», «Календарь» проверяются как в методах Выбран() для соответствующего типа объекта;
- значение типа «СписокЗначений» считается пустым, если в нем нет значений;
- значение типа «ТаблицаЗначений» считается пустым, если нет ни одной строки таблицы;
Пример использования
Пример кода с использованием функции ПустоеЗначение():
ДатаНачала = ТекущаяДата(); … Если ПустоеЗначение(ДатаНачала) = 1 Тогда Предупреждение(«Вы не указали дату начала отчета!»); Возврат; КонецЕсли;
При попытке создать OLE объект 1С, возникает ошибка «Неудачная попытка создания объекта (V77.Application)». Существует 3 основные причины возникновения этой ошибки: отсутствие необходимых ключей в реестре (или ограничение доступа к ним), неправильное значение ключей реестра или параметров DCOM.
Во-первых, проверьте, чтобы 1С была установлена из дистрибутива, а не просто скопирована с другого компьютера. При необходимости переустановите 1С. При обычном копировании 1С в реестре может отсутствовать ряд ключей, которые создаются при установке.
Во-вторых, в реестре может быть неправильно указан путь к 1cv7.exe и, как результат, возникнет ошибка при создании OLE-объекта. Проверьте HKEY_LOCAL_MACHINE\SOFTWARE\Classes\V77.Application\CLSID, там будет указан GUID. В моем случае это {63112D80-94F0-11D2-9F39-008048DA120F}. Далее перейдите к HKEY_CLASSES_ROOT\CLSID\{63112D80-94F0-11D2-9F39-008048DA120F}\LocalServer32 и проверьте путь к приложению 1cv7.exe. Так же проверьте имеет ли пользователь доступ на чтение к указанным выше веткам реестра.
В третьих, проблема может быть связана с настройками DCOM. Обычно это происходит после установки веб-расширения и изменения параметров DCOM. В этом случае запустите dcomcnfg.exe, найдите 77.Application, на закладке «Удостоверение» установите переключатель в положение «Текущий пользователь».
Пожалуйста,