Tool1CD: отрежем донорскую почку

Публикация № 830338

Администрирование - Администрирование данных 1С - Сервисные утилиты

tool1cd

Ваша база мертва? Что ж, кое-что в ней ещё теплится.

Рассмотрим очередной пример использования библиотеки tool1d. Сейчас мы напишем программку, которая облегчила бы мне жизнь пару лет назад.

Сценарий из жизни: розничная сеть, РИБ, кассовые узлы раз в месяц где-нибудь да сломаются, данные по последним продажам не попадают в центральный узел. Как мы решали проблему тогда? Поддержка копирует файл базы из магазина в офис, я с помощью старой доброй Tool1CD выгружаю таблицы с данными о чеках, глазами смотрю, чего не достаёт, руками редактирую выгрузку и запускаю костыль в виде обработки загрузки. Сейчас, имея на руках новый, подключаемый вариант библиотеки, я бы поступил по-другому. Новый сценарий: поддержка копирует файл базы себе на компьютер, запускает в 1С в центральном узле обработку, в обработке выбирает файл базы, нажимает большую волшебную кнопку "Вжух!" и нужные данные появляются в базе. Без моего участия, совсем. Вот таким образом мне нравится делать свою работу! Давайте попробуем сделать такую обработку.

Открываем предыдущую статью, выполняем "Часть 0" и только после этого идём дальше.

Что же должна делать обработка под капотом? Алгоритм следующий:

  • Открываем базу
  • Определяем принадлежность узла
  • Получаем список чеков в базе узла
  • Сравниваем с чеками в текущей базе - выделяем список недостающих
  • По списку запрашиваем данные из базы узла

В качестве упрощения нам дано то, что все узлы созданы путём копирования базы шаблона, потому мы заранее знаем соответствие метаданных и таблиц. Сведения о моей базе:

  • _NODE17 - план обмена По Кассе, поле _FLD254RREF - Касса. Отсюда узнаём, откуда база.
  • _DOCUMENT122 - Чек ККМ. Отсюда тащим недостающие данные.

Сведения о вашей базе можете получить через функцию глобального контекста 1С ПолучитьСтруктуруХраненияБазыДанных или через множество обработок на её основе, которые можно найти на Инфостарте.

Работа на стороне 1С останется за кадром, здесь мы будем рассматривать только то , что касается непосредственно функционала tool1cd.

Исходя из алгоритма API нашей компоненты должен выглядеть как-то так:

  • ОткрытьБазу / OpenDatabase. Принимает параметр - путь к базе. Возвращает 0, если база открыта, или код ошибки.
  • ОпределитьПринадлежностьУзла / GetNodeIdentity. Принимает параметры - имя таблицы плана обмена и имя поля с кассой. Возвращает строку - GUID кассы ККМ.
  • ПолучитьСписокДокументов / GetDocumentList. Принимает параметр - имя таблицы. Возвращает строку - список GUID через запятую.
  • ПолучитьДанныеПоДокументу / GetDocumentData. Принимает параметры - имя таблицы и GUID документа. Возвращает строку - XML представление документа.
  • ЗакрытьБазу / CloseDatabase. Закрывает открытую базу.

 

Псевдокод на 1С:

 
 Процедура ОбработатьУзел

Начнём с простого

Создадим методы ОткрытьБазу и ЗакрытьБазу. Как в первой статье каждую процедуру и функцию я буду добавлять путём копирования сигнатуры CallAsProc или CallAsFunc и перенаправления вызова, обёрнутого в try/catch, также опуская все остальные необходимые формальности.

Потому как мы работаем с базой не за один заход и нам нужно хранить состояние (открытую базу), то нам необходимо добавить поле T_1CD *db в объявление класса:

 
 class CAddInNative

За исключением обработки tVariant код методов крайне прост:

 
 CAddInNative::OpenDatabase
 
 CAddInNative::CloseDatabase

 

Пробежимся по записям

Итак, базу мы открыли, теперь надо определить её принадлежность. Мы знаем имя таблицы, надо её найти, обойти, найти нужную запись и получить значение поля. Для начала введём вспомогательную функцию, которая будет обрабатывать параметр-строку:

 
extract_string

Находим таблицу, находим в ней запись c заполненным _PREDEFINEDID - это ЭтотУзел в плане обмена.

 
 
 CAddInNative::GetNodeIdentity

В приведённом выше коде глаз должен зацепиться за два момента:

  1. Мы ищем таблицу по имени циклом - кто первый пришлёт патч, а?
  2. Конструкция get<BinaryGuid>. BinaryGuid - класс, специально для работы с GUID-ами в файловой базе. Основных задач у него всего две - взять данные из базы и преобразовать их в строку и наоборот - получить строку и преобразовать её в двоичный вид. Напомню очень хорошую статью про GUID - она обязательна к ознакомлению перед просмотром исходников BinaryGuid.

 

Получим список документов. Ничего нового - ищем таблицу, перебираем записи итератором, формируем строку из GUID-ов.

 
 CAddInNative::GetDocumentList

 

Получение данных по документу.

Для начала надо составить список таблиц, в которых хранятся данные документа. Это основная таблица документа (_DOCUMENT122) и табличные части (_DOCUMENT122_VT*). Также стоит отметить, что в табличных частях поле Ссылка имеет имя не _IDREF, а _DOCUMENT122_IDREF.

 
 
CAddInNative::GetDocumentData

Вспомогательная процедура по выводу полей:

 
 store_record_to_stream

В коде процедуры обратим внимание на два момента:

  1. Проверка is_null_value. Нельзя так просто взять и получить значение поля, которое null - будет выброшено исключение.
  2. get_xml_string - любезно заранее подготовленная функция, которая возвращает строковое представление значения, которое можно просто взять и запихнуть в XML.

На выходе получаем текст XML, подобный следующему:

 
Пример получаемого XML-файла

Уверен, загрузить такого вида XML не составит большого труда, потому расписывать здесь парсер нет никакого смысла.

Что дальше?

Если у вас есть какие-то интересные случаи, которые можно было бы разобрать - пишите в комментариях, обсудим.

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

Скачать файлы

Наименование Файл Версия Размер
AddInNativeWin32.dll

.dll 1,89Mb
8
.dll 1,89Mb 8 Скачать
VNCOMP83-tool1cd-2

.zip 955,76Kb
15
.zip 955,76Kb 15 Скачать

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. nporrep 48 16.05.18 07:29 Сейчас в теме
Шикарный материал.
На подобном уровне должен бы существовать инструмент по программному созданию объектов метаданных конфигурации + внешних отчетов/обработок.
Например, для сборки файла внешней печатной формы с заполненными по шаблону предопределенными процедурами и приёмами БСП-кидо.
Обработка для программного создания обработок... Программное создание форм по описаниями.... Программное создание регистров по описаниям.
Каждый из 1С-разработчиков быстро нашёл бы способ собрать себе собственную палитру шаблонов кода / описаний МД, чтобы затем на этом уровне программном прослойки делать рутинную работу максимально быстро и максимально привычными способами.
2. baton_pk 409 16.05.18 07:57 Сейчас в теме
(1)
На подобном уровне должен бы существовать инструмент по программному созданию объектов метаданных конфигурации + внешних отчетов/обработок.

надеюсь, скоро для этого будет хватать штатных возможностей конфигуратора/EDT. Без участия внешних костылей.

Tool1CD - он всё же про то, когда 1С уже не может.
Crazy_Max; +1 Ответить
3. nporrep 48 16.05.18 09:00 Сейчас в теме
(2) Любая IDEшка так или иначе навязывает приемы разработки разработчику, иногда полезные, иногда не очень.
Спросите у адептов Eclipse, удобно ли им работать в JetBrains, на совсем чужих "быстрых клавишах", например =)
А ведь у EDT ноги из того же JetBrains'а растут...
Проблема ещё и в проприетарности не только кода платформы, но и форматов файлов конфигурации и внешних обработов/отчеботок.
А за попытки расковырять эти самые форматы ребята в жёлтых майках бьют по пальцам железной линейкой с фирменным логотипом...
4. Infactum 294 16.05.18 09:19 Сейчас в теме
(3) Форматы уже давно все расковыряли. Да, есть кое-где белые пятна, но это не мешает. То, что информация не публикуется конкретно на этом портале - это уже вопрос к политике инфостарта.
EDT никак не связано с JetBrains. Оно на eclipse основано.
1С похоже денег пожалели на то, чтобы реальных профессионалов нанять в разработке IDE.
8. nporrep 48 17.05.18 04:06 Сейчас в теме
(4) Я давно далек от таких подробностей, хотя и иногда ностальгирую по тем временам.
Егор, Вы взялись бы реализовать задачу, описанную в (1)?
10. nporrep 48 17.05.18 06:02 Сейчас в теме
(9) Детишки, ну не занимайтесь ерундой, на карме скажется больше, чем на кошельке отразится =)
11. kuntashov 415 17.05.18 18:29 Сейчас в теме
(1)
Например, для сборки файла внешней печатной формы с заполненными по шаблону предопределенными процедурами и приёмами БСП-кидо.



Если я вас правильно понял, то давно уже есть, правда сделано на базе альтернативного распаковщика/запаковщика, см. статью https://infostart.ru/public/454827/

На его базе в том числе сделан онлайн-сервис для генерации шаблонов ВПФ для БСП:

http://www.develplatform.ru/OneC/Online-instruments/CEDP
baton_pk; +1 Ответить
5. nytlenc 16.05.18 10:52 Сейчас в теме
Самому не уверен что пригодится, но!!! За идею и ее реализацию однозначно 5.
6. bulpi 179 16.05.18 13:19 Сейчас в теме
"Уверен, загрузить такого вида XML не составит большого труда, потому расписывать здесь парсер нет никакого смысла."

Не понял. А через ПрочитатьXML он не прочтется ? А почему ?
7. baton_pk 409 16.05.18 13:33 Сейчас в теме
(6)
Не понял. А через ПрочитатьXML он не прочтется ? А почему ?

потому что сериализатор 1С ничего не знает про эти _FLD12345. Потому всё равно нужен код вида:
СтрокаТаблицы.Номенклатура = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(ХМЛ._FLD12345));
12. logarifm 1087 17.05.18 19:54 Сейчас в теме
Отличный материал. Но насчет сейчас. Вот какраз-таки сейчас у 1с есть отличная вещь как сервер на несколько рабочих мест. Вполне хватает мне для магазинов, а их у меня больше 50. Везде стоят СКЛ експресы и подобной ситуации по вылету нет. Да и базы намного шустрее!
13. baton_pk 409 17.05.18 22:14 Сейчас в теме
(12) базы ломаются у разных контор разных размеров и формата деятельности.

PS искренне рад за вас. Я тоже считаю мини-сервер отличным решением для магазинов. Вот только что-то так ни одна сеть у меня и не созрела - дорого, а выхлоп для бизнеса сомнительный.
14. tezdal 23 18.05.18 13:31 Сейчас в теме
(12) Сервер это клевая затея, но у нас по формату сети в магазине чаще всего 1 касса, нет компьютера администратора и прочего. есть супервайзеры ответственные за свой сегмент, вот у них мобильный офис на колесах в машине организован. Если касс в магазине => 2 тогда никто не подпишет смету на сервер. поэтому и приходится вертеться)
Оставьте свое сообщение

См. также

Tool1CD Beta в деле Промо

Разработка внешних компонент v8 Абонемент ($m)

Пс, парень! Не хочешь немного сырых байтов?

1 стартмани

09.05.2018    27435    31    baton_pk    26    

Централизованное управление кластером 1С Предприятия, состоящим из нескольких рабочих серверов, работающих на платформе GNU/Linux

Сервисные утилиты v8 Абонемент ($m)

При эксплуатации крупных информационных систем, в состав которых могут входить десятки серверов 1С Предприятия, зачастую возникают ситуации, требующие однотипных действий на всех серверах кластера 1С Предприятия или на всех серверах контура. В настоящей статье представлен способ централизованного управления серверами 1С Предприятия, работающими на платформе GNU/Linux. Подобный подход может быть использован и для других задач, возникающих в процессе эксплуатации крупных систем, с целью сокращения как временных затрат специалистов, так и времени простоя системы.

1 стартмани

26.08.2019    3951    Sloth    0    

Внешние компоненты мобильной платформы 1С для ОС Андроид

Разработка внешних компонент Мобильная разработка v8::Mobile Абонемент ($m)

На трех простых примерах описана процедура разработки внешних компонент для Андроид. Статья написана по мотивам доклада на конференции INFOSTART 2018 EDUCATION.

31.01.2019    17747    IgorKissil    25    

Go. Разбор лога технологического журнала. Достойная альтернатива perl'у

Сервисные утилиты Инструментарий разработчика v8 1cv8.cf Абонемент ($m)

Началось все с того, что я познакомился с перловыми скриптами для парса ТЖ которые размещены на kb.1c.ru (например в этой статье https://kb.1c.ru/articleView.jsp?id=113). По началу мне дико понравилось то, что перл разбирал гигабайты логов за считанные минуты, но позитив мой угасал обратно пропорционально с тем, насколько глубже я погружался в "кроличью нору" ....

1 стартмани

24.10.2018    20673    lazarenko    39    

Внешние компоненты. Мобильное приложение 1С Промо

Разработка внешних компонент Мобильная разработка v8::Mobile 1cv8.cf Абонемент ($m)

Пример применения технологии внешних компонент для мобильной платформы 1С (Android)

1 стартмани

17.02.2017    42539    flyer    36    

Мониторинг журнала регистрации при помощи Powershell

Сервисные утилиты Журнал регистрации v8 Абонемент ($m)

Работа с журналом регистрации в формате SQLite внешними средствами на примере мониторинга изменений в конфигурации базы данных.

1 стартмани

12.07.2018    13105    user768334    7    

Использование регулярных выражений (RegExp) в Linux

Сервисные утилиты Администрирование данных 1С Внешние источники данных v8 Абонемент ($m)

Описывается способ использования регулярных выражений (RegExp) в Linux с использованием тех же компонентов, что и в Windows (COM-объекты VBScript.RegExp).

1 стартмани

20.04.2018    8839    vsbronnikov    12    

Мониторинг изменений рабочих конфигураций. Часть 1. Сохранение конфигураций из базы SQL без конфигуратора

Сервисные утилиты v8 1cv8.cf Абонемент ($m)

Выгружаем исходники из SQL напрямую скриптом, собираем CF и контролируем реальные изменения в рабочих базах из браузера.

1 стартмани

28.02.2018    19622    user768334    25    

Практика доступа в базу 1С через протокол oData. Чтение данных

Сервисные утилиты Практика программирования Администрирование данных 1С v8 1cv8.cf Абонемент ($m)

Для чего нужен доступ в базу 1С через REST-интерфейс по протокол oData? Как его организовать? Как не будучи гуру в JavaScript и .NET получить быстрый визуальный доступ к данным базы 1С? Попробую дать ответ на эти вопросы и прокомментирую некоторые нюансы, с которыми я столкнулся.

1 стартмани

11.12.2017    106897    Dementor    57    

Как формируется GUID?

Практика программирования v8 Бесплатно (free)

"Коллеги, есть идеи, как получить последнюю созданную характеристику? Реквизиты полностью идентичны(код, наименование, и т.п.)."(c) "Насколько я знаю, ссылка не обеспечивает последовательность, а только уникальность."(c) "Я сделал по Максимум(Ссылка). Но, чета, мне кажется, это неправильно."(c) "Слышал что в ГУИд содержится как раз время создания и по всей логике вещей сортировка по ссылке должна сортировать по моменту создания объекта"(c) Сколько раз вы слышали такие фразы? На удивление я не обнаружил информации по этой теме, пришлось разбираться самому...

16.06.2017    89464    kuzyara    76    

Получение информации об экспортных свойствах и методах объектов 1С через COM.

Разработка внешних компонент Внешние источники данных v8 1cv8.cf Абонемент ($m)

Как из тела COM-объекта или внешней компоненты определить состав свойств и методов объектов 1С агрегатных типов? Все ответы здесь.

1 стартмани

03.09.2013    14429    gislink    5    

Пример загрузки/выгрузки файлов на SFTP сервер из 1С

Разработка внешних компонент v8 Россия Абонемент ($m)

К сожалению 1С пока не позволяет своими средствами обмениваться файлами с SFTP сервером. Столкнувшись с этой проблемой, оптимальным для себя выбрал вариант с использованием бесплатного SFTP клиента:WinSCP. Я не нашел в сети примеров работы 1С с этой утилитой через COM-соединение, поэтому выкладываю свой. Возможно кому-то будет полезен.

1 стартмани

29.07.2013    61527    ram3    77    

Работа с внешней компонентой на сервере (Linux)

Разработка внешних компонент v8 Абонемент ($m)

Это небольшая заметка о том как можно подключить и использовать внешнюю компоненту на сервере "1С:Предприятие".

1 стартмани

08.07.2013    14319    quebracho    6    

1С 8.2 переключение раскладки клавиатуры (с помощью dynwrap.dll)

Разработка внешних компонент Универсальные функции v8 Абонемент ($m)

Функция для автоматического переключения раскладки клавиатуры. (с помощью dynwrap.dll) Дабы не переключать каждый раз (при вводе информации в разных полях) с "Rus" на "Eng", можно эту работу возложить на функцию.

1 стартмани

22.05.2013    15309    Serg23ru    24    

1С:Предприятие 8.2. Управляемая Форма. Меняем иконку рабочего стола.

Сервисные утилиты Производительность и оптимизация (HighLoad) Практика программирования Работа с интерфейсом v8 1cv8.cf Россия Абонемент ($m)

Для конфигураций имеющих свой дизайн важно иметь возможность сменить не только картинки разделов для созданных подсистем, но и картинку рабочего стола, но менять ее нет возможности. Сама 1С объясняет это тем что интерфейс любой конфигурации должен быть унифицирован: "Дело не в одной картинке, а в общей стилистике для любых конфигураций. Важно чтобы пользователи привыкали к общему стилю и одинаково воспринимали одинаковые элементы в разных конфигурациях - это ускорит и освоение конфигураций и повседневную работу пользователей с ними." Но все же можно попытаться ее сменить.

1 стартмани

28.09.2012    29545    ghostaz    39    

Как написать COM-объект для 1С на Visual Studio C# 2008

Практика программирования Универсальные обработки Разработка внешних компонент v8 1cv8.cf Абонемент ($m)

Расширяем функционал 1С с помощью разработки подключаемого COM-объекта! Пишем код на Visual C# 2008 для открытия CD-ROM'а, получения списка процессов и использования возможностей системы text-to-speech.

5 стартмани

11.09.2012    83825    RainyAugust22    56