В процессе разработки интеграции с 1С часто возникает необходимость написать вычисления на языке 1С или языке запросов 1С, а также отладить их. Для написания таких вычислений удобно использовать готовые обработки 1С, рассмотрим их в этой статье.
Скачать архив с обработками можно по ссылке: Полезные обработки 1С.zip
Чтобы запустить обработку:
1. Запустите «1С Предприятие» в режиме «Обычное приложение». Для этого используйте дополнительный параметр запуска:
/RunModeOrdinaryApplication
2. В меню Файл выберите пункт Открыть и в открывшемся окне выберите нужный файл.
Обработка «Поиск объекта 1С по GUID»
Обработка позволяет:
- определить GUID любого объекта 1С (записи справочника, документа и пр.);
- по заданному GUID найти ссылку на объект 1С (запись справочника документа и пр.).
Чтобы определить GUID объекта 1С:
1. Запустите обработку «Поиск ссылки по GUID».
2. В поле Ссылка нажмите на кнопку T, выберите тип объекта.
3. Нажмите на кнопку и выберите объект 1С. Если необходимо выбрать другой объект, очистите значение по кнопке .
4. Нажмите на кнопку Показать GUID. В результате в поле GUID отобразится уникальный идентификатор объекта 1С.
Чтобы определить ссылку на объект 1С, введите уникальный идентификатор объекта в поле GUID и нажмите на кнопку Найти ссылку. Таким образом в поле Ссылка отобразится найденный объект из базы данных. Кнопка позволяет открыть карточку текущего объекта.
Обработка «Консоль запросов»
Обработка позволяет составить и выполнить запрос на языке запросов 1С. Используется для написания вычислений в событии коннектора «При выгрузке из 1С».
Рассмотрим, как выполняется обработка на примере запроса по получению юридического адреса контрагента:
1. Запустите обработку «Консоль запросов».
2. В основное окне обработки добавьте текст запроса:
ВЫБРАТЬ
КИ.Представление КАК Адрес
ИЗ
РегистрСведений.КонтактнаяИнформация КАК КИ
ГДЕ
КИ.Объект = &Объект
И КИ.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес)
И КИ.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ЮрАдресКонтрагента)
Запрос можно составить самостоятельно или с помощью конструктора запросов (пункт контекстного меню Конструктор запросов):
В тексте запроса, как правило, используются параметры. В нашем примере используется параметр &Объект, через который в запрос передается ссылка на запись справочника Контрагенты. Значения параметров задаются в левом нижнем окне обработки.
3. Чтобы выполнить запрос, нажмите кнопку Выполнить (F7). Результат выполнения запроса отобразится в правом нижнем окне.
Обработка «Выполнение произвольного кода»
Обработка позволяет быстро проверить вычисления на языке 1С, не создавая новую обработку в конфигурации 1С.
Чтобы проверить вычисление:
1. Запустите обработку «Выполнение произвольного кода».
2. В окне редактора напишите код вычислений:
3. Для выполнения кода нажмите на кнопку Выполнить.
Ниже рассмотрим примеры использования обработки «Выполнение произвольного кода».
Пример 1
Необходимо написать вычисления для события коннектора «При выгрузке из 1С» по получению юридического адреса контрагента. Текст события представляет собой xml-текст, в котором задаются вычисляемые реквизиты 1С. Подробнее см. в справке Коннектор к «1С:Предприятие 8» События и фильтры.
Ранее с помощью обработки «Консоль запросов» мы создали и отладили запрос:
ВЫБРАТЬ
КИ.Представление КАК Адрес
ИЗ
РегистрСведений.КонтактнаяИнформация КАК КИ
ГДЕ
КИ.Объект = &Объект
И КИ.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес)
И КИ.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ЮрАдресКонтрагента)
Теперь нужно написать вычисления на языке 1С, в которых нужно выполнить этот запрос и вернуть результат в виде строки.
Для отладки вычислений добавьте определение переменной Источник:
Источник = Справочники.Контрагенты.НайтиПоКоду("000000007");
И вывод результата:
Сообщить(Значение);
В событие «При выгрузке из 1С» эти строки переносить не нужно, т.к. переменная Источник в событии является предопределенной и будет заполняться автоматически.
В итоге событие «При выгрузке из 1С» будет выглядеть следующим образом:
<Свойства>
<Свойство>
<Код>60</Код>
<Наименование>Выч_ЮридическийАдрес</Наименование>
<Порядок>60</Порядок>
<Источник/>
<Приемник Имя="Выч_ЮридическийАдрес" Вид="Реквизит" Тип="Строка"/>
<ПриВыгрузке>Запрос = Новый Запрос("ВЫБРАТЬ
| КИ.Представление КАК Адрес
|ИЗ
| РегистрСведений.КонтактнаяИнформация КАК КИ
|ГДЕ
| КИ.Объект = &Объект
| И КИ.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес)
| И КИ.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ЮрАдресКонтрагента)");
Запрос.УстановитьПараметр("Объект", Источник);
Выборка = Запрос.Выполнить().Выбрать();
Значение = ?(Выборка.Следующий(), СокрЛП(Выборка.Адрес), "");
</ПриВыгрузке>
</Свойство>
</Свойства>
Пример 2
Необходимо на форму 1С добавить кнопку, при нажатии на которую будет запускаться сценарий DIRECTUM. В сценарий требуется передать один параметр. При завершении сценария получить результат его выполнения.
Для этого выполните отладку вычисления, в котором запускается сценарий DIRECTUM по кнопке из 1С:
Обработка «Регистрация изменений для обмена»
Обработка включена в большинство конфигураций 1С. С ее помощью можно просматривать или редактировать записи о регистрации объектов в плане обмена 1С, в том числе:
- просматривать список метаданных, участвующих в обмене;
- просматривать список объектов, для которых зарегистрированы изменения;
- добавлять и снимать регистрацию для объектов, а также использовать запросы для выбора данных;
- просматривать данные в формате XML.
Рассмотрим возможности обработки наглядно в 1С:
1. Запустите обработку «Регистрация изменений для обмена».
2. В верхнем поле выберите узел обмена, например, DIRECTUM.
В результате в нижней области отобразятся все объекты, включенные в План обмена. В колонке Авторегистрация – текущее состояние авторегистрации изменений и количество зарегистрированных в данный момент объектов.
К объектам можно применить действия:
Обработка «Выгрузка и загрузка данных XML»
Универсальная обработка позволяет выполнить полную или частичную выгрузку данных информационной базы в xml-файл. Обработку можно использовать для миграции данных из 1С.
Сценарии использования обработки:
- Выгрузка записей справочника из одной базы и загрузка в другую. Разработка в базах должна быть идентичной.
- Выгрузка записей справочника в качестве резервной копии. Если в процессе работы со справочником записи затерлись либо были удалены, то их можно восстановить из xml-файла.
- Выгрузка данных в xml-файл для последующей миграции этих данных в систему DIRECTUM с помощью заказной разработки.
Обработка может выгружать записи объектов:
- Константы;
- Справочники;
- Документы;
- Последовательности;
- ПланыВидовХарактеристик;
- ПланыСчетов;
- ПланыВидовРасчета;
- РегистрыСведений;
- РегистрыНакопления;
- РегистрыБухгалтерии;
- РегистрыРасчета;
- БизнесПроцессы;
- Задачи;
- ПланыОбмена.
Особенности обработки:
- Фильтр можно накладывать на любой из реквизитов справочника. Например, настроить фильтрацию по справочнику Внутренние документы по полю ВидДокумента = Договор.
- Вместе с основным справочником можно выгружать связанные записи других справочников. Например, настроить выгрузку, чтобы вместе с внутренними документами выгружались связанные записи справочника Корреспонденты.
Обработка «Массовая регистрация изменений для обмена»
Обработку удобно использовать при тестировании интеграции с 1С.
Обработка позволяет зарегистрировать в плане обмена нужное количество записей для указанного справочника:
1. Запустите обработку «Массовая регистрация изменений для обмена».
2. Выберите необходимый справочник и нажмите на кнопку Выполнить.
Битая ссылка, <Объект не найден>, Уникальный Идентификатор, GUID 74
Когда кто-то удаляет данные из базы без проверки ссылок на эти объекты, то везде где этот объект использовался появляется сообщение вида: Объект не найден (84:bf5600145e3710ab11dda4c605dbe824) .
https://helpf.pro/uploads/img/_1-46z7I4U7Ww.png
В
Битая ссылка, , Уникальный Идентификатор, GUID — Управляемые формы 4
Переделал обработки из статей Битая ссылка, Объект не найден, Уникальный Идентификатор, GUID и Поиск в базе битых ссылок — объект не найден под Управляемые формы. Скачать
Блокировка записей, невозможно изменить или удалить из регистра. Конфликт блокировок MS SQL + 1C 4
При попытке удалить запись из регистра сведений — получаю ошибку: она заблокирована, ошибка блокировок и т.д. Отключил всех пользователей, перезапустил сервер, пробую удалить — опять ошибка блокировки Путем тестов было вяснено, что проблема
В учетной политике не указан вид тарифа страховых взносов. Как указать? 0
Создайте новую запись учетной политики с начала года — Например 01.01.2013
В учетной смотрите дату начала учетной политики. Поставьте дату начала года (например 01.01.13) закладка появиться должна.
Проверьте Тариф страховых взносов: Меню Зарпла
Выгрузка результата запроса в текстовый файл с разделителями 1
Запрос = Новый Запрос();
Запрос.УстановитьПараметр(» ДатаНач» ,НачалоДня(ДатаНач));
Запрос.УстановитьПараметр(» ДатаКон» ,КонецДня(ДатаКон));
Запрос.УстановитьПараметр(» Организация» ,Организация);
Запрос.Текст = » ВЫБРАТЬ
| ПоступлениеТоваровУ
Посмотреть все результаты поиска похожих
07.06.07 — 12:36
А то метод ПолучитьСсылку работает только для конкретного менеджера.
А если я не знаю тип?
Функция обНайтиСсылкуПоГУИД(ГУИД) Экспорт
Перем РезСсылка;
Для Каждого МД Из Метаданные.Справочники Цикл
РезСсылка=Справочники[МД.Имя].ПолучитьСсылку(ГУИД);
Если РезСсылка.ПолучитьОбъект()<>Неопределено Тогда
Возврат РезСсылка;
КонецЕсли;
КонецЦикла;
Для Каждого МД Из Метаданные.Документы Цикл
РезСсылка=Документы[МД.Имя].ПолучитьСсылку(ГУИД);
Если РезСсылка.ПолучитьОбъект()<>Неопределено Тогда
РезСсылка.ПолучитьОбъект();
Возврат РезСсылка;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
1 — 07.06.07 — 12:36
2 — 07.06.07 — 18:23
ап
3 — 08.06.07 — 09:10
только через SQL
4 — 08.06.07 — 10:13
офф:
гениальное решение — сразу пиши в книгу знаний…
тупой перебор — рулит… я так чувствую, ты во всех случаях, когда не можешь придумать хоть какое-то реальное решение, просто прогоняешь данные через тупой перебор… сочувствую тем, кто пользуется твоими поделками
5 — 08.06.07 — 10:30
+4
создаем рег. сведений, в который пишем при записи объектов ссылки и в качестве ресурса — тип объекта или имя из метаданных…
а потом просто ищем ссылку в этом регистре…
6 — 08.06.07 — 10:46
(5) Хахаха…. А про транзакционную нагрузку на базу ты подумал? К тому же это не универсальное и даже вредное явление. Яйца курицу учат? Гыгыгы
7 — 08.06.07 — 10:58
(5) ужос
8 — 08.06.07 — 11:13
(0) Тоже, искал решение и не нашел. Делал перебором из списка.
Кстати
РезСсылка.ПолучитьОбъект()
работает очень, очень медленно.
Строка(РезСсылка) = «»
работает в два раза быстрей, но тоже медленно.
9 — 08.06.07 — 12:01
(0) ОФФ
Справочники[МД.Имя] в контексте можно просто МД.
10 — 08.06.07 — 14:59
то (6)
Вот в (4) такая же бредовая хрень, как и в (0)… Особенно в плане того, чтобы пихать подобные хрени в КЗ… А вот теперь иди и считай, сколько такой хрени ты занес в КЗ, где неопытные вместо того, чтобы найти что-нибудь стоящее, забивают голову ерундой…
P.S. какова задача — такого решение… чтобы получить запросом данные по гуиду, надо чтобы он был там в той форме, куда позволяет доставать запрос… отсюда и решение (4)
а теперь попробуй доказать, что на данный момент есть еще решение, при котором ты ЗАПРОСОМ вытянешь ссылку по гуиду…
PPS а про курицу мне понравилось…
11 — 08.06.07 — 15:08
А откуда взят ГУИД? если из таблицы, то можно для ускорения перебора узнать ограничения типа…
12 — 08.06.07 — 15:16
НайтиПоСсылкам(<Список ссылок>)
Параметры:
<Список ссылок> (обязательный)
Тип: Массив. Массив со списком ссылок на объекты, ссылки на которые нужно найти.
Возвращаемое значение:
Тип: ТаблицаЗначений. Возвращает ссылки на найденные объекты в виде ТаблицаЗначений, состоящей из колонок с индексами: 0 — искомая ссылка; 1 — ссылка на объект, если найденная ссылка соответствует объектной таблице или значение, идентифицирующее запись необъектной таблицы; 2 — объект метаданных, которому соответствуют данные, в которых найдена ссылка.
Описание:
Осуществляет поиск ссылок на объекты, переданные в параметре <Список ссылок>.
13 — 08.06.07 — 15:18
(12)-точно, бред. не читать.:((
14 — 08.06.07 — 15:27
(11) а какая разница, нам ведь нужно гениальное решение. гы куриц всегда с динозаврами сравниваю — после просмотра фильма «парк юрского периода»
15 — 08.06.07 — 15:27
(13) я так и понял.
(10) ваш бред не осилил.
При чем здесь запросом.
Задача четкая — есть GUID, нужно найти объект.
НАпример, если данные пришли из журнала регистрации.
Для универсальности ищу решение, когда вид ссылки неизвестен.
16 — 08.06.07 — 15:36
Запросом можно, но не уверен, что будет быстрее, чем (0).
17 — 08.06.07 — 16:07
(16) да, запросом можно, но тоже не уверен, а если сразу по всем тэйблам, можно напороться на ошибку 255 таблиц. или только порциями по 255 таблиц, тогда можно.
18 — 08.06.07 — 16:55
(0) Интересно,в 8.1 упростили поиск по ГУИДу?
19 — 08.06.07 — 16:56
(18) с чего бы это, гыгыгы…
20 — 08.06.07 — 17:43
В запросах ГУИД тоже недоступен, только в объекте
21 — 08.06.07 — 17:47
(20) а да, точно.
22 — 09.06.07 — 09:37
(15) Если говорить про универсальность, то может быть ситуация, когда два элемента РАЗНЫХ справочников или документов имеют одинаковый ГУИД.
23 — 09.06.07 — 10:38
(22) нужно проверить.. вероятность ничтожна
24 — 09.06.07 — 10:50
(23) Если вы напишете при создании элемнетов УстановитьСсылкуНового(ОдинаковыйГУИД), то вероятность будет 100%.
На вероятность нельзя полагаться при универсальном решении.
25 — 09.06.07 — 10:50
(22)+
ЗначениеВСТрокуВнутр(Объект.Ссылка) выдает нечто1.
Объект.Ссылка.УникальныйИдентийикатор() тоже выдает нечто2.
Нечто2 являнтся подмножеством Нечто1. (все перетасовано, но видно).
26 — 09.06.07 — 11:35
мням..надо повернуть задачу в другую плоскость..
исать тип объекта.
27 — 09.06.07 — 11:37
искать то есть..
28 — 09.06.07 — 11:38
в гуиде есть информация о таблице в которой храниццо элемент или нет?
29 — 09.06.07 — 11:43
(28) — судя по (25) — нет. +(РазДва).
30 — 09.06.07 — 11:46
мдамс.. странно.
31 — 09.06.07 — 11:52
(28) Ничего странного, так задумано. В GUID нет типа объекта, иначе бы не хватило места на уникальность.
32 — 09.06.07 — 12:18
(31) ты неправ.. есть там привязка или нет к таблице при формировании гуида
никак не скажется на уникальности.
если только на очень больших объёмах записей(~триллионы)
33 — 09.06.07 — 12:52
Если есть задача оптимизировать данную процедуру в (0), если возможность не использовать ПолучитьОбъект, который работает очень медленно, кроме того обращается к базе и требует от пользователя дополнительных прав на объекты…
В качестве альтернативы можно использовать подобную функцию
Функция ПроверитьСсылку(Знач Ссылка, Знач Гуид)
Перем Результат;
Результат = Истина;
//Получаем из ГУИДа ссылку в том формате, который использует сама 1С
ТекстГуид = «» + ГУИД;
СсылкаИзГУИД = «»;
ПозицияТире = Найти(ТекстГуид, «-«);
к = 0;
Пока ПозицияТире > 0 И к <= 2 Цикл
СсылкаИзГУИД = Лев(ТекстГуид, ПозицияТире-1) + СсылкаИзГУИД;
ТекстГуид = Сред(ТекстГуид, ПозицияТире+1);
ПозицияТире = Найти(ТекстГуид, «-«);
к = к + 1;
КонецЦикла;
СсылкаИзГУИД = СтрЗаменить(ТекстГуид, «-«, «») + СсылкаИзГУИД;
//Проверяем, есть в полученной ссылке системные строки
Если Найти(«» + Ссылка, «Объект не найден») > 0 И Найти(«» + Ссылка, СсылкаИзГУИД) > 0 Тогда
Результат = Ложь;
КонецЕсли;
Возврат Результат;
КонецФункции
Алгоритм не оптимален, но в принципе довольно надежен…
Гений 1С
34 — 09.06.07 — 15:34
(33) клево, слушай, а разве запрос в представлении не вернет для несущетвующего объекта Объект не найден? Тогда можно и запросом шебуршать, строго порциями по 255 таблиц, гыгыгы…
Недавно после нестандартного обмена данными я увидел знакомое <Объект не найден> в полях некоторых элементов базы-приемника и задался вопросом, как можно быстро в базе-источнике найти объект, от которого уехал только ID ? Особенно если реквизит в базе-приемнике составного типа или вообще его тип не ясен… И в ответ написал обработку.
Итак, обработка позволяет по ID определить, какому объекту базы данных он принадлежит. Поддерживаются все ссылочные типы базы данных.
Реализовано три режима: поиск ссылки, создание объекта БД и получение ссылки для объекта БД.
Поиск ссылки
Идентификатор, вводимый в поле «Известный GUID» может иметь различные виды:
1. Объект не найден (25:888ba76e-9ccf-aed3-4a2f-1d8152ba0f17)
Обычно такие ссылки, они же «битые» появляются в результате обмена данными, когда ссылка на объект выгрузилась, а сам объект — нет.
2. 25:888ba76e-9ccf-aed3-4a2f-1d8152ba0f17
Частный случай пункта 1.
3. 888ba76e-9ccf-aed3-4a2f-1d8152ba0f17
Обычная ссылка, полученная применением функции Строка() к объекту типа «УникальныйИдентификатор()». Может где-нибудь храниться, например в регистре «Соответствие объектов информационных баз».
4. 888ba76e9ccfaed34a2f1d8152ba0f17
Тоже, что и в пункте 3, без дефисов.
Можно вводить (копипастить) в любом формате. Следует отметить, что если в ID присутствует номер таблицы из структуры хранения БД, то объект определяется из этой таблицы. Например, здесь это номер «25» — число перед «:» в идентификаторе.
Далее — нажимаем кнопку «Найти ссылку» и в поле «Результат» появится ссылка на объект БД (если он найдется, если нет, то «битая»). Если объект не найден, то его можно создать — на второй закладке.
Итак, поиск осуществляется:
— если есть номер таблицы, то сразу в этой таблице;
— если номера нет, то по порядку во всех ссылочных типах БД.
Создание объекта
Все тоже самое, только кнопка другая — «Создать объект». Система пытается создать объект и установить для него введенный ID. Если удалось, то пользователю предлагается заполнить форму этого объекта и записать его в БД.
Опять же, если в идентификаторе есть номер таблицы, то создаем объект сразу в этой таблице. Если нет, то выбираем тип создаваемого объекта руками.
Получение ссылки
По выбранной ссылке на объект БД система получает ее уникальный идентификатор в 3-х вариантах (для удобства).
Также определяется название таблицы хранения объекта, которому принадлежит выбранная ссылка.
Области использования обработки
Сколько раз я видел у клиентов криво настроенный обмен, в результате которого появлялась куча битых ссылок. При анализе таких обменов (особенно XML) важно понимать, что за объект скрывается за битой ссылкой в базе-источнике. Особенно когда реквизит приемника составного типа или вообще любая ссылка. Эта обработка быстро ответит на данный вопрос. Без нее нудно тратилось время на выяснение сего момента, зачастую набивая код в «табло», т.к. нужно было быстро понять, в чем дело, а обработку писать не хотелось.
Также, например, в регистре «Соответствие объектов информационных баз» хранится это самое соответствие. Объект в текущей базе ясен, а вот что там за ID лежит — вопрос. Хотя, конечно, тут тип можно определить быстро.
Еще бывали моменты, когда есть список ID-шников и попробуй определи, что это за объекты.
Полезно использовать мою обработку вместе с обработками поиска битых ссылок.
Обработка написана под 8.2, но можно использовать и для 8.1 с предварительной конвертацией. Формы — обычные.
Планируемые доработки
1. Получение ID для любой ссылки. Реализовано.
2. Возможность передавать список ID-шников для поиска ссылок в базе-источнике.
3. Получение ID ссылки на объект в другой базе через COM-соединение и наоборот.