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

Запомните на будущее как непреложный факт:

  1. Из местной базы в базу OLE (и, соответственно, наоборот) напрямую методом присвоения можно перенести только числовые значения, даты и строки ограниченной длины. Т.е. местная база «поймет» прекрасно без дополнительных алгоритмов преобразования полученного значения только простые типы значений. Кроме того, под ограничением строк подразумевается проблемы с пониманием в местной базе реквизитов объектов базы OLE типа Строка неограниченной длины. К этому же еще надо добавить и периодические реквизиты. Естественно, под методом присвоения подразумеваются и попытки сравнения объектов из разных баз.
  2. Есть проблемы при попытке перенести пустую дату – 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, чтобы как-то собрать для запроса переменные!

  1. Поскольку сам текст запроса и функции EvalExpr() является по сути текстом, а не набором параметров, то напрямую передать ему ссылку на элемент справочника, документ, счет и т.п. нельзя. Исключение может быть составлено для конкретных значений перечислений, видов субконто, констант, планов счетов и т.п.
  2. Хоть и многим и так понятно, что я скажу дальше, но я все-таки уточню: при описании переменных в тексте запроса не забывайте, что объекты базы надо указывать напрямую, без всяких префиксов типа БазаОле.
  3. Отрабатывать запрос сложно тем, что ошибки, например, при компиляции напрямую не увидеть. Поэтому начинаем пошагово готовится к отработке запроса в базе OLE.

Вначале допишем в глобальном модуле базы OLE несколько строк, которые нам помогут в работе:

Теперь начинаем потихоньку писать сам запрос. Что мы имеем? В форме диалога местной базы есть несколько реквизитов диалога (либо это будут местные переменные):

Мы начинаем писать запрос и сразу попадаем в этакую ловушку:

ТекстЗапроса = » Период с Начдата по КонДата; «;

Вроде все в порядке, но такой запрос не выполнится в базе OLE, так как там понятия не имеют, что такое НачДата и КонДата. Ведь эти переменные действительны только для местной базы! Переписываем запрос заново:

Так… Дошли до условий отбора в запросе. Рассмотрим два варианта, когда выбран ВыбТовар:

Казалось бы все очень просто. По аналогии – если уникальность для товаров ведется по наименованию, то простой заменой слова «код» на слово «наименование» мы решаем вопрос и здесь. Теперь рассмотрим, когда мы выбрали группу, т.е. текст условия должен будет выглядеть так:

| Условие (товар.ПринадлежитГруппе(КакаяТоГруппа)=1);

Правда, и здесь можно проблему решить двумями путями ;-). Первый путь – когда мы имеем дело с двухуровневым справочником. Тогда проблема группы решается так же просто, как и в первом варианте:

А если справочник очень даже многоуровневый? Вот для этого мы и используем написанную ранее
функцию. Предположим, что список значений запроса с индексом массива 1 мы будем использовать
для хранения подобных значений (например, хранить в нем группы товаров, клиентов) для
хитрых условий. Итак, например, в ВыбТовар у нас указана группа товаров, а в
ВыбКлиент – группа клиентов, которым мы товары группы ВыбТовар продавали.

Кроме того, мы должны пропустить накладные возвратов поставщикам, и не забыть, что товары
надо еще и отбирать по флажку ТолькоЗамерзающийЗимойТовар:

Уфф. Вроде все. Остается только запустить запрос:

Ну, а с реквизитами запроса разбираемся так же, как указано было выше в предыдущих разделах. И не забываем, что кроме хранения конкретных значений можно использовать другие списки значений запроса. Например, можно заполнить какой-либо список значений запроса списком клиентов и использовать его в запросе:

Что осталось за бортом

Перенос реквизитов неограниченной длины, работа с периодическими реквизитами.

ГРОМАДНЕЙШИЕ ИЗВИНЕНИЯ ЗА ВОЗМОЖНЫЕ СИНТАКСИЧЕСКИЕ И ОРФОГРАФИЧЕСКИЕ ОШИБКИ В ДОКУМЕНТЕ – ПИСАЛ БЕЗ ПРОВЕРКИ В V7, БОЛЬШУЮ ЧАСТЬ – ПО ПАМЯТИ.

ЕСЛИ ОБНАРУЖИТЕ ОШИБКИ, ДА И ВООБЩЕ, ЕСЛИ ЕСТЬ ВОПРОСЫ ПО OLE – ПИШИТЕ. ЕСЛИ ВЫКРОЮ ВРЕМЯ, ТО ПОИЩУ РЕШЕНИЕ.

  1. Содержание

    Установка в Windows х32

  1. «C:\Program Files (x86)\» 32-х разрядной системы в

  2. «C:\Documents and Settings\All Users\Главное меню\Программы»

    «C:\ProgramData\Microsoft\Windows\Start Menu\Programs»

    (пути могут различаться, в зависимости от используемых версий Windows).

  3. «C:\Windows\SysWOW64\» 64-х разрядной операционной системы.

  1. Отключение DEP для процесса 1cv7.exe (для серверных ОС)

Далее надо исключить процесс 1cv7.exe из проверки DEP, для этого заходим в свойства системы ( «Пуск» — «Панель управления» — «Система и безопасность» — «Система» ) и выбираем «Дополнительные параметры системы» .

Далее переходим на вкладку «Предотвращение выполнения данных» , нажимаем кнопку «Добавить» и выбираем файл «C:\Program Files (x86)\1Cv77\BIN\1cv7s.exe» , который мы скопировали в шаге 1.

  1. Установка драйверов защиты

Теперь необходимо установить драйвера защиты. 1С:Предприятие использует аппаратно-программную систему защиты HASP от Aladdin Knowledge Systems Ltd. Для запуска всех модулей защиты необходимо:

    1. Вставить электронный ключ HASP в USB или LPT порт компьютера, в зависимости от типа ключа.

    2. Установить драйвер ключа HASP4 для Windows, следуя инструкциям инсталлятора. Скачать можно с официально сайта или с текущего.

  1. Установить менеджер лицензий HASP4 для Windows, следуя инструкциям инсталлятора. Скачать можно с официально сайта или с текущего. Устанавливать менеджер необходимо как сервис, выбрав «Service (nhsrvice.exe)» во время установки.Если у вас Windows 10 то выйдет ошибка, просто нажмите Выполнить в любом случае.

  2. Запустить ярлык «Установка драйвера защиты» , находящийся по пути «Пуск» — «Все программы» — «1С Предприятие 7.7» .

  3. Дождаться сообщения об успешной установке драйвера и перезагрузить компьютер.

  4. Изменение порядка сортировки ИБ

Исправляем ошибку «Порядок сортировки, установленный для базы данных, отличается от системного!» если такая ошибка имеет место быть при запуске «1С:Предприятие».

  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, на закладке «Удостоверение» установите переключатель в положение «Текущий пользователь».

Пожалуйста,

Add a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *