Андрей Соколов | Sokolov:Dev
168 subscribers
10 photos
2 files
10 links
Непрофессионально о профессии, и около того
Download Telegram
#Хештег_ПриНачалеРаботыСистемы😎

Привет!
Меня зовут Андрей Соколов, я разработчик 1С.

Говорят, у каждого разработчика есть папка «Сделать потом». Через полгода прокрастинации я открываю свою, и тут будет первый пост.
Почти как WebSocket-клиенты в 1С, только меня никто не ждал :)

Тут - самые страшные «монстры» из избранного, заметок и ночных кошмаров одинэсника.

Возможно, (но не обещаю) будет даже какой-то полезный контент - редкий и ценный, как адекватное ТЗ от Заказчика.

Да, чатика не будет - хватает рабочих 🙈
👍72🔥2
#Хештег_оМонстроКлавишах

Когда я решил сменить профессию и уйти в разработку, я четко понимал что хочу работать именно с 1С. Документация на русском, русскоязычное сообщество, код кириллицей.
Для меня, который с английским на «вы», это подходило. И, честно говоря, мне вести разработку на родном языке в кайф. Понимание сущностей, интерфейсов, абстракций - оно попроще, когда ты носитель языка)

Но не обошлось и без ложки дёгтя. В нашем случае - это спецсимволы: «&», «#», квадратные «[ ]» и угловые «<>» скобки. Они-то ладно, мышечная память быстро осваивает ввод через Alt. Но вот ЕСТЬNULL. Считали, сколько клавиш надо нажать, чтобы набрать ЕСТЬNULL в стандартной раскладке? А сколько раз его нужно использовать в среднестатистическом запросе с соединениями?

Проблема ещё была в том, что у меня был «зоопарк» подключений. Просьбы «а поставьте программку..» часто заканчивались «мальчик, иди отсюда», а покупать скриптовую клаву не хотелось.

Тогда меня спас AutoHotkey. Portable-версия, файл настроек с одной строкой и готово: «естьнал» превращается в «ЕСТЬNULL». Без вникания, «а что он там ещё может».

В начале этого года вместо зоопарка клиентских удалённых рабочих столов появился один, свой, родной (ну, почти). Так я вернулся к местами забытой, но не потерявшей актуальности раскладке «Чистова». Только вот спустя полгода сожительства с ней, при запуске проекта и переезде на новый «уютный» рабочий стол (в родных корпоративных пенатах 🥺) услышал забытое, но привычное «Мы не поставим это». А руки-то ее уже просят, уже привыкли!

Затащила старая добрая классика - AutoHotkey снова в деле. Наконец-то, я немного разобрался в механике работы скриптов - даже навайбшкодил и теперь тешу своё ОКР - у меня есть горячие клавиши, выравнивающие текст по знакам равно и запятой по центру.

О чем вообще этот спитч? - цените своё время. Даже те доли секунды, которые вы тратите на ввод ЕСТЬNULL, можно потратить на что-то более интересное. Ну или на пиво

И кстати: респект разработчикам 1С:Элемент, там спецсимволы через Alt поддерживаются из коробки. Уж не знаю, притащенно это из Theia, или кто-то так же устал от них, как я 😁

Хочешь, сделаю из этого полноценный пост для блога или статьи? #непалимся
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥143👍3
Как-то незаметно быстро пролетели два месяца с последнего (первого) поста. Сегодня, вместе с ветром и осенним обострением, хочется накинуть на вентилятор.

Давайте зададим вопрос ИИ:
Кто такой программист и кто такой разработчик? Чем эти понятия отличаются друг от друга?

И возьмем пока за аксиому ответ:
Программист сосредоточен на написании кода по заданию, в то время как разработчик отвечает за весь процесс работы над продуктом, от проектирования до реализации.

Года два-три назад в нашем коллективе родился термин "Доработчик". "Доработчик" - это не программист из определения выше, а что-то другое. Он выкручивается из ситуации, не задавая лишних вопросов: ему сказали - он сделал. Зачем, почему, для кого - это уже философия, а философия в его спринтах не предусмотрена.

Парадокс в том, что роль "доработчика" кажется удобной на первый взгляд. Нет амбиций - нет разочарований. Нет вопросов - нет конфликтов. Но именно эта позиция становится потолком для профессионального роста. Разработчик (в нашем определении) не просто исполняет поставленную задачу - он понимает архитектуру, видит подводные камни, предлагает альтернативы. Он становится не исполнителем, а советником для бизнеса.

Прост ли путь из доработчиков в разработчики? Нет. Это требует любопытства. Это требует смелости задавать вопросы, которые кажутся неудобными. Это требует готовности принять ответственность не только за код и программу, а за результат работы людей и компании.

Банально звучит, да? "Просто будь любознательным." Но дело в том, что любопытство - это не врожденное качество. Это выбор, который делается каждый день: потратить лишние пятнадцать минут на изучение чужого кода или идти дальше, потому что спешишь.

Любопытство - это готовность копать глубже, даже когда очевидного ответа хватило бы. Это означает делать код-ревью коллег не потому, что ты обязан, а потому, что хочешь понять, как они думают. Это значит разбираться в том, как работает решение, а не просто применять готовый рецепт. Это требует времени. Это требует энергии. И да, это противоречит спринту, где нужно сдать три задачи до пятницы.

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

Понимание контекста часто требует задавать неудобные вопросы. И вот здесь начинается самое интересное. "Неудобные вопросы" часто косвенно указывают на то, что кто-то накосячил. "А может быть, мы неправильно подошли к этой архитектуре?" - и вот вся архитектура вдруг выглядит как груда говна, которую нужно переделывать. Они могут означать, что спринт нужно пересчитать - а это значит, что кто-то будет объяснять на уровне выше, почему график сорвался.

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

Эта смелость неразрывно связана с третьей составляющей - готовностью принять ответственность. Не только за код, а за результат. Что произойдет, когда данных станет в сто раз больше? Как это повлияет на остальную систему? Это означает больше работы. Это означает, что ты не можешь просто уйти с работы, когда код залил. Это означает, что ты берешь на себя риск. Если что-то сломается, ты не сможешь сказать: "Так была поставлена задача". Потому что ты отвечаешь за реальный результат, а не за буквальное выполнение инструкции.

И ирония в том, что самый "ленивый" путь (просто делай, что сказали) на деле требует больше сил в долгосрочной перспективе - ты застреваешь на одном месте, твоя ценность падает, проекты становятся скучными, а рынок проходит мимо - чем путь к профессионализму, который кажется тяжелее. Потому что первый ведет в никуда, а второй - куда-то.
🔥12👍64🤝1
Комбинации1С.png
669.8 KB
#МамаЯВТелевизоре

Всем привет!
Где-то вот сейчас я начал свой доклад в Клубе питерских одинэсников, «закрывая гештальт» по теме горячих клавиш.
Я надеюсь, что вы сейчас слушаете мой доклад, а не читаете это сообщение 😁
По сложившейся традиции - оставляю ссылки на материалы, озвученные в рамках доклада.
1. Раскладка Павла Чистова
2. Microsoft Keyboard Layout Creator
3. AutoHotkey

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

Ну, и обещанная шпаргалка по комбинациям клавиш в 1С - прикреплена.

Всем ✌️
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥169👍8
HotKeys.pdf
3.8 MB
#Послевкусие

Нашел время сесть и проанализировать свой доклад в пятницу.
Признаюсь, не удалось рассказать его так как хотел, все-таки опыта публичных выступлений маловато 😉

Опыт - сын ошибок трудных, так что новых выступлений не избежать 😁

Как оказалось, тема осталась не до конца раскрытой, а значит серии постов про горячие клавиши - быть!

Хочу поблагодарить Иосифа, Таню и весь орг. комитет Клуба: без вас ничего бы не получилось! 🫶
Всем кто был, лично или онлайн - спасибо за вашу поддержку и фидбек! 💪

И по просьбам:
Игоря - версия шпаргалки в pdf;
Романа - комментарии к посту ✍️
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤‍🔥12🔥9
Всем привет!

Как и обещал, в небольшой серии постов мы поговорим о горячих клавишах.
Ловите первую подборку для навигации ⬇️

1. Найти в дереве » Ctrl + T
Позволяет мгновенно перейти к объекту в дереве конфигурации, чье окно сейчас открыто перед вами.

2. Перейти к строке » Ctrl + G
Вам скинули текст ошибки с номером строки? Не надо искать метод и листать его код колесиком мыши - нажали, вбили номер, вы на месте.

3. Перейти к свойствам объекта » Ctrl + E
Крайне удобная фича! При работе с реквизитами объектов и элементами формы - просто незаменимо.

А если используете вкладки (группы) на панели свойств, то переключать можно этими сочетаниями. Ctrl + PgDn / Ctrl + PgUp. Да и не только в конфигураторе. В пользовательском так же можно переключать страницы формы.

4. Поиск » Ctrl + F
Ну, тут всё понятно. База.
Но есть еще для ускорения:

Найти следующий » F3
Найти предыдущий » Shift + F3

А вот это многие забывают, хотя штука полезнейшая для поиска мест использования переменных или вызовов методов:

Искать выделенный фрагмент дальше по тексту » Ctrl + F3
Искать выделенный фрагмент в обратном направлении » Ctrl + Shift + F3
Без вызова диалогового окна поиска. Мелочь, а приятно.

5. Глобальный поиск » Ctrl + Shift + F
Может, не самый быстрый инструмент, но когда нужно прочесать файлы или конкретные подсистемы - bellissimo. Гибкая настройка области поиска решает.

И к нему же вишенка на торте:
6. Результаты глобального поиска » Ctrl + Shift + H
Эта комбинация возвращает вас к окну с результатами предыдущих поисков. Чтобы не запускать поиск заново, когда случайно закрыл окно. Там, кстати, еще история поиска есть.

👍 - если узнали что-то новое
🤝 - если не в этот раз
🔥 - если всё равно будешь тыкать мышкой, потому что ты у мамы снайпер
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥6🤝43
Начинаем продолжать продолжаем начинать про горячие клавиши.
Тема старая (навигация) - клавиши новые 🙃

1. Перейти к объявлению » F12
Это - база :) Стоите на названии переменной или вызове функции - нажали F12 - вы на месте объявления. Работает везде (нет): переменные, методы.

2. Возврат к месту перехода » Ctrl + -
Перешли по F12 на три уровня и хотите обратно? Эта комбинация возвращает вас туда, откуда вы пришли.

3. Сворачивание и разворачивание групп
Когда блоков кода много и нужна панорама. На цифровой клавиатуре:

Свернуть одну группу » Ctrl + Num -
Развернуть одну группу » Ctrl + Num +
Свернуть все сразу » Ctrl + Shift + Num -
Развернуть все сразу » Ctrl + Shift + Num +

4. Обновить группировки » Ctrl + Shift + R
Если структура свёртывания поехала или сломалась после редактирования кода.
Кстати, знаю как это сделать комбинацией, но не знаю где команда в меню 😁

5. Навигация по "операторным скобкам"
Встаньте на открывающей конструкции условия или цикла - нажмите Ctrl + ] - перемещаетесь на закрывающую. И наоборот.

Перейти на закрывающую скобку » Ctrl + ]
Перейти на открывающую скобку » Ctrl + [

(операторная скобка = Если/КонецЕсли и т.д.)

6. Список процедур и функций модуля » Ctrl + Alt + P
Быстрый переход по методам в текущем модуле.
Там и поиск работает 😉

7. В конец строки » End
Не так нужна сама по себе, но в комбинации End + Enter заменяет отсутсвующую комбинацию Ctrl + Enter, доступную в других IDE

👍 - если узнали что-то новое
🤝 - если не в этот раз
🔥 - используешь хоткеи только чтобы переключать окна, когда заходит начальник

#1C_Shortcuts
Please open Telegram to view this post
VIEW IN TELEGRAM
👍143🔥3🤝2
Всем привет! ✌️
Сегодня закроем тему горячих клавиш последней подборкой.

Поехали!

Закладки📑
Полезный и удобный функционал, если нужно часто перемещаться между одними и теми же блоками кода.

Установить/снять закладку » Alt + F2
Помечаешь место в коде, которое потом нужно будет найти. Особенно полезно, когда нужно вернуться к нескольким местам в модуле.

Следующая закладка » F2
Перемещаешься на следующую метку.

Предыдущая закладка » Shift + F2
Возвращаешься на предыдущую метку.

Перемещение по закладкам, соответственно, зациклено


Редактор управляемых форм 🖼

Крайне удобные комбинации для перемещения в редакторе:
Форма » Alt + 1
Модуль » Alt + 2
Элементы » Alt + 3
Реквизиты » Alt + 4
Команды » Alt + 5
Командный интерфейс » Alt + 6
Параметры » Alt + 7


Буфер обмена и калькулятор 🔢

Удобная фишка в режиме предприятия, когда нужно посчитать сумму нескольких строк в колонке

Добавить к буферу обмена » Shift + Num+
Вычесть из буфера обмена » Shift + Num-
Открыть калькулятор » Ctrl + F2


Отладка
▶️

Начать/продолжить отладку » F5
Перезапуск приложения для отладки » Ctrl + Shift + F5
Запуск приложения без отладки » Ctrl + F5
Прекратить отладку » Shift + F5
Шагнуть в » F11
Шагнуть через » F10
Шагнуть из » Shift + F11
Идти до курсора » Shift + F10
Установить/снять точку останова » F9


Просто приятные мелочи 🔧

Удалить текущую строку » Ctrl + L
Так же будет работать с несколькими строками, если они выделены. По сравнению с Backspace и Delete фишка в том, что удаляет строку целиком, даже если выделена только часть.

Проверка модуля » Ctrl + F7
Обновить конфигурацию базы данных » F7

Очистить служебные сообщения » Ctrl + Alt + Z
Закрыть служебные сообщения » Ctrl + Shift + Z

Ну вот, друзья.
Не ставил задачи полностью пересказать справку по горячим клавишам, выбирал те что использую сам и на мой взгляд наиболее полезные 👍
Весь список есть в справке к платформе, скомпоновал его в удобном виде в png и pdf.

P.S. Недавно наткнулся на интересный пост про горячие клавиши Windows, что-то из списка утащил к себе в применение.

👍 - если узнали что-то новое
🤝 - если не в этот раз
🔥 - если сэкономленные секунды потратишь на пятничное пиво

#1C_Shortcuts
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6❤‍🔥5👍51🤝1
Всем привет! 🖐
Пока лонгриды пишутся (и удаляются), запускаю рубрику #ПодКапотомERP.
В ней посмотрим как на программный интерфейс, так и на некоторые механизмы флагманского решения: какие инструменты уже лежат в коробке, чтобы не изобретать велосипеды.

На «операционном столе» - ERP 2.5.22.132, первым обследуем программный интерфейс модуля ОбщегоНазначенияУТ.

Вокруг него есть загадка: переедут ли эти методы в БСП или так и останутся жить в ERP?
Спойлер: никто не знает. Но пользоваться ими можно уже здесь и сейчас.

Мой топ методов:

➡️СоответствиеМассивовПоТипамОбъектов
Сборная солянка в документах-основаниях? Привет, Транспортная накладная 👋.
Метод раскладывает массив ссылок по полочкам (типам). Крайне удобно, чтобы собрать динамический запрос. Привет стандарту 437!

➡️ПерваяСтрокаРезультатаЗапросаВСтруктуру
Маст-хэв. Серьезно. Имя метода говорит сама за себя

➡️ОписаниеТиповПоТипу
Возвращает описание типов по переданному типу. Хорош, если не пользуетесь Конструктором описания типов

➡️ЗначенияРеквизитовОбъектаПоУмолчанию
Если переданная ссылка пустая - вернет значение по умолчанию для этого типа.
⚠️ Нюанс: С составными полями магии не ждите, возвращает Неопределено.

➡️ЗначениеРеквизитаОбъектаТипаБулево
Если значение имеет тип, отличный от Булево - вернет Ложь.

➡️Пауза
Да, да, пауза! 🥲
⚠️ Важно: Использовать только в фоновом задании.

➡️СравнитьТаблицыЗначений
Сравнивает две ТЗ построчно, как отдельно по колонкам, там и по ее содержимому.

➡️МассивВТаблицуЗначений
Все знают про ТаблицаЗначенийВМассив из ОбщегоНазначения, но не про обратную конвертацию. может и не надо? 😁
⚠️ Важно: Метод типизирует колонки по типам в первой структуре массива.

➡️НайтиИУдалитьСтрокиТаблицыЗначений и УдалитьСтрокиТаблицы
Удобный интерфейс для удаления строк в ТЗ.
Но не забывайте, что оптимальный способ удаления зависит от объема удаляемых строк, подробности - тут.

➡️МассивДатИзПериода и РазностьДат
Вернут массив дней в период / разницу между двумя датами

➡️КлючКоллекцииПоЗначению, ПоменятьКлючИЗначениеКоллекции
При "жонглировании" структурами / соответствиями

Конечно, помимо ОбщегоНазначенияУТ есть клиентский и клиент-серверный модули.
Так например, в ОбщегоНазначенияУТКлиентСервер есть раздел ПреобразованиеТиповДанных для работы с массивами, структурами и прочими типами.
Загляните внутрь, прежде чем писать очередной "Универсальный механизм". Возможно, 1С это уже написала за вас.

Знали про эти методы или пишете свои?
👍 - узнали что-то новое
🤝 - не в этот раз
🔥 - пишу свои велосипеды, так надежнее
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥5❤‍🔥3🤓2
Всем привет! 🖐

Продолжаем рубрику #ПодКапотомERP
Сегодня "обследуем" сразу несколько механизмов, поехали!

⭐️ Первыми будут общие модули "семейства" КомпоновкаДанных. (КомпоновкаДанныхКлиентСервер, КомпоновкаДанныхКлиент, КомпоновкаДанныхСервер, КомпоновкаДанныхПовтИсп).

Натурально "хлеб с маслом" для программной работы с СКД.

➡️Для параметров: УстановитьПараметр / ПолучитьПараметр;
➡️Отборов: ДобавитьОтбор / УдалитьОтбор, ДобавитьГруппуОтбора;
➡️Для оформления, обработки полей и группировок - ДобавитьВыбранноеПоле, ДобавитьГруппировку, ДобавитьОформляемоеПоле.

Долгое время КомпоновкаДанныхКлиентСервер был только в УТКАУП, а в "обделенную" УНФ его приходилось тащить самостоятельно. Однако в последнем релизе увидел его, пусть и в урезанном варианте. Спасибо разработчикам УНФ 🥹
И да, я не ошибся, указав КомпоновкаДанныхПовтИсп, т.к. он тоже предоставляет программный интерфейс.

⭐️ Вот, кстати, еще один представитель общих модулей с повторным использованием возвращаемых значений, предоставляющих его: ЗначениеНастроекПовтИсп

Этот модуль содержит большое количество методов для обращения к элементам "по-умолчанию".
➡️Склад, организация, банковский счет контрагента или организации, и многое другое.

В большинстве случаев реализация внутри вызывает типовые методы, вроде Справочники.Организации.ПолучитьОрганизациюПоУмолчанию, обеспечивая задачу кеширования.

⭐️ Третьим сегодня будет модуль менеджера справочника УпаковкиЕдиницыИзмерения.
Ходит слух, что еще не все знают, как пересчитывать коэффициенты упаковок в запросах 😁

Модуль менеджера дает возможность как определять тексты запроса упаковок:
➡️ТекстЗапросаКоэффициентаУпаковки
➡️ТекстЗапросаВесУпаковки
➡️ТекстЗапросаОбъемУпаковки

так и при обработке на встроенном языке обращаться к этим данным:
➡️КоэффициентыУпаковок
➡️КоэффициентВесОбъемПрочиеРеквизитыУпаковки

А на этом сегодня все 🤘

Знали про эти методы или пишете свои?
👍 - узнали что-то новое
🤝 - не в этот раз
🔥 - вендор опять все поменяет в следующем релизе
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14👏4🤩4
Всем привет! Рассказываем про наших спикеров!

🔥 Андрей Соколов, ведущий разработчик, Корус Консалтинг

В своем выступлении «Как съесть XML с JSON, и не поперхнуться» Андрей разберет ключевые отличия форматов, а также определит их роль в современной разработке. Мы выясним разницу между потоковой и объектной обработкой, обсудим выбор формата для разных задач, и даже попробуем сломать 1С в поисках «пасхалок». Из доклада узнаем какие инструменты есть во встроенном языке для работы с ними и подискутируем, когда выбрать XML, а когда — JSON.

👇Подробности и регистрация:
https://yellowspb.timepad.ru/event/3808242/
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍6🥰5
Всем привет! 🖐

Продолжаем ковырять типовую конфигурацию в рубрике #ПодКапотомERP

⭐️ Начнем с общего модуля ПартнерыИКонтрагенты.
➡️ПолучитьКонтрагентаПартнераПоУмолчанию
➡️ПолучитьВсехКонтрагентовПартнера
➡️ПолучитьНижестоящихПартнеров
Все это - удобный интерфейс для манипуляций связкой Партнер - Контрагент и иерархией Партнеров.
➡️Когда-то может и "потеряшка" ДенежныеСредстваСервер.ПолучитьПартнераПоКонтрагенту найдет путь к своим собратьям.

⭐️ Дальше у нас РаботаСКурсамиВалютУТ
➡️ПолучитьКоэффициентПересчетаИзВалютыВВалюту
➡️ПолучитьКурсВалюты
➡️ПолучитьКоэффициентыПересчетаВалюты
➡️ПересчитатьВВалюту

Как же много "Получить" в этом посте 😁
Тем не менее, методы от этого менее полезными не становятся 🙃
➡️СформироватьСуммуПрописью - хотя я думаю, что те кто часто делают печатные формы, и так с ним уже знакомы.

⭐️ Еще один интересный зверь - общий модуль СхемыЗапросов.
Знаю много противников использования схем, скажете что даю вредные советы и будете правы - но я не смог обойти его мимо 😁

➡️НайтиЗапросРезультата - Находит в схеме первый запрос, выбирающий результативные данные (то есть, не создающий и не уничтожающий временные таблицы).
❗️ Обратите внимание, что возвращаемое значение - Структура, описание точки схемы запроса, выбирающего данные.
Ну совершенно точно следует раскурить этот модуль целиком )

➡️УстановитьПомещениеВоВременнуюТаблицу - Устанавливает ключевое слово ПОМЕСТИТЬ и имя временной таблицы в текст запроса
➡️УстановитьИндексациюПолейЗапроса - Устанавливает индексацию в выборке
➡️УстановитьВыборкуРазрешенныхЗаписей, УстановитьВыборкуРазрешенныхЗаписейВоВсемЗапросе - Устанавливает в секцию ВЫБРАТЬ ключевое слово "РАЗРЕШЕННЫЕ"

Используйте с умом 😉

А на этом сегодня все 🤘

Знали про эти методы или пишете свои?
👍 - узнали что-то новое
🤝 - не в этот раз
🔥 - у меня свой велопарк, зато без "Получить" без именах методов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15👏43🙏1
Всем привет! 🖐

👤 Вчера выступил в Желтом клубе с темой "Как съесть XML с JSON и не поперхнуться".

Как и обещал, ссылки на материалы, упомянутые в докладе:

➡️State of Application Strategy Report - видение компании F5 по API - доступно только под тремя буквами.

Первоисточники по форматам:
➡️ https://www.w3.org/XML/ - почитать про XML
➡️https://www.json.org/json-ru.html - и про JSON

Плагины:
➡️Для Notepad++: XML и JSON
➡️Для VSCode: XML и JSON.

➡️Упомянутое интервью с Дугласом Крокфордом - основателем JSON

➡️Отличный материал по XDTO для начального понимания о работе механизма.

➡️PIMON 2025 | Марат Бареев | JSON-first integration flows - доклад с "соседнего цеха". Во многом именно доклад Марата сподвигнул меня осветить эту тему в нашем 1С-сообществе.

Друзья!
Было очень круто и приятно пообщаться! 🫶
Хочу выразить благодарность всем присутствовавшим, и конечно, отдельно Паше - за организацию, помощь и поддержку ☺️

А я, тем временем, буду возвращаться к своим "археологическим" раскопкам типовых конфигураций, и уже готовлю кое-что интересное для вас!
Не переключайтесь, дальше - больше! 🙌
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18👍5🤝31
Всем привет 🖖

Год назад у нас на проекте внедрения ERPУХ случилась маленькая, но показательная "авария".
Решил её записать, пока детали ещё более‑менее живут в памяти.

▪️Доставку таких изменений, как создание и заполнение служебных справочников, ПВХ и прочих объектов, мы завязали на типовой механизм обновления информационной базы из БСП.

▪️Схема стандартная и понятная: Пишем обработчики обновления, которые создают нужные объекты (изменяют документы, движения, заполняют базу данных и т.д. - нужное подчеркнуть), и поднимаем версию сборки. Подсистема сравнивает версии в конфигурации и в базе, если не совпадает, запускает обновление.

▪️Сами обработчики могут отрабатывать монопольно, отложенно, с многопоточкой и прочими радостями жизни. У нас тоже всё шло по плану, пока в один прекрасный момент обновление не стало периодически завершаться с ошибкой на типовом обработчике УХ:

Конфликт блокировок при выполнении транзакции
Ошибка блокировки области данных

База данных заблокирована
компьютер: 1c-erp-dev, пользователь: Администратор, сеанс: 11,
начат: 06.03.2025 10:02:19, приложение: Фоновое задание


После этого с той же ошибкой обваливалась запись в служебный регистр подсистемы обновления. То есть падал не только конкретный обработчик - разваливался весь процесс обновления.
При этом поднималась версия сборки в регистре "Версии подсистем", и при перезапуске сеанса обновление уже не запускалось.

▪️Понятно, что в одном из обработчиков запускалось фоновое задание, делающее монопольный режим не таким уж и монопольным.
Что за обработчик? Как и зачем он запускает фоновое задание? Кому оторвать руки - а так же множество других вопросов крутилось в голове.

▪️Разумеется, проблема под пристальным наблюдением отладчика ошибка у нас попросту не воспроизводилась, да и в целом поведение ошибки было похоже на мерцательную аритмию - воспроизводясь один раз на 5 запусков обновления.

Чтож, одеваем гидрокостюм и заныриваем поглубже в пучину механизма обновления.
Погрузившись, опредилили два факта:
1. Так как обработчики нашей подсистемы выполняются целиком и полностью - в регистре "Версии подсистем" устанавливается новая версия нашей подсистемы.
Зависимых от нас подсистем в сборке нет, а следовательно - при перезапуске нет и причин повторять процедуру обновления, несмотря на то, что она после нас обновление завершилось с ошибкой.

2. Как говорится, "главное в расследовании не выйти на самих себя".
Фоновое задание запускалось не из какого‑то «хитрого» кода обновления. Оно стартовало при записи элемента нетипового справочника.
В нем была включена платформенная история изменений и стоял флаг «Обновлять историю данных сразу после записи».

Сценарий получался такой:
1. Обработчик записывает элемент справочника;
2. Платформа тут же пытается записать историю изменений, запуская фоновое задание;
3. Механизм обновления успевает обработать успешное завершение подсистемы, обновив версию в регистре;
4. Обработчики основной конфигурации, выполняющиеся после нас, ловят блокировку от фонового задания;
5. При перезапуске все сборки совпадают в конфигурации и базе данных, обновление не запускается.

▪️Какая мораль?
Лишний (не до конца разобранный / не понятый) флажок сегодня - ночные танцы с обновлением завтра.
Это напоминает про простой принцип: система не обязана совпадать с нашими ожиданиями. Она честно делает то, что ты мы ей разрешаем, а не то, что имеем в виду.

А на этом сегодня все, до связи! ✌️
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍85
Всем привет! 🖐

Это текстовая версия доклада из Жёлтого клуба. Кто пропустил: ссылки на материалы - тут.

➡️ Начнём с вопроса: зачем нам вообще это знать?

Любая мало-мальски живая база - не изолированный остров.
Сайт с каталогом и заказами, WB/Ozon, Битрикс24, Честный знак, соседние базы в ландшафте... Со всем этим сегодня мы строим интеграции. И эти интеграции в подавляющем большинстве используют XML или JSON.

Если смотреть на статистику за 2024 год, то более 75% интеграций реализованы с помощью этих форматов.

Почему так сложилось?
Чтобы ответить на этот вопрос, нам потребуется сделать небольшой экскурс в историю и вернуться ровно на 30 лет назад — в 1996 год.

Именно в 1996 году W3C начинает разработку XML, опираясь на существующий формат SGML. В 1998 году выходит версия 1.0, которая, по сути, дошла и до наших дней.

XML быстро начал набирать популярность благодаря XML Schema, XPath и поддержке крупнейших игроков вроде Oracle и IBM.

Однако, в угоду универсальности, "не угодили никому".
XML оказался не самым простым форматом для парсинга в браузере.
В 2001 году появилась, и была реализована идея обмена данными с помощью JavaScript Object.
А настоящую популярность JSON получает в 2004–2006 годах вместе с технологией AJAX, когда браузеры стали получать с сервера не готовую HTML-страницу, а конкретный набор данных.

➡️ Давайте чуть подробнее посмотрим на модели представления данных в обоих форматах.

XML:
- данные описываются с помощью дерева элементов и атрибутов;
- в корне документа может быть только один элемент;
- все данные в XML по умолчанию строковые;
- типизация задаётся с помощью XSD;
- имена элементов подчиняются ограничениям: они должны начинаться с буквы или символа подчёркивания.

JSON:
- данные описываются с помощью объектов и массивов;
- корневым может быть любой элемент;
- типов больше: помимо строк есть числа, булевы значения и null;
- ограничений на имена полей значительно меньше. Хотя пустые или неуникальные ключи всё равно лучше не использовать: заранее неизвестно, как это трактует получатель сообщения.

➡️ Про типизацию, схемы и контракты

Мы уже знаем, что в XML все данные по умолчанию представлены как строки, а типизировать их можно с помощью XML-схем. Но XML-схемы нужны не только для этого.

XML-схема позволяет описать структуру и правила, по которым должен быть устроен XML-документ:
- какие типы данных используются;
- какие поля обязательны, а какие нет;
- какие ограничения допустимы: min/max, длина, паттерн.

В контексте 1С XML-схема представлена объектом ПакетXDTO.

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

➡️ Про конвертацию данных между форматами

На первый взгляд может показаться, что это довольно редкая задача.
Но на практике у неё просто своя интеграционная специфика.

Предположим, что наша система является участником одного общего бизнес-процесса, который проходит через три системы:
- первая система, выполнив свою часть работы, передаёт нам данные в формате JSON;
- мы в своей системе выполняем определённую задачу, а затем должны передать данные в третью систему, которая (упс, привет legacy), умеет работать только с XML;
- в этом случае задача конвертации из одного формата в другой ложится на нас.

Или другой пример:
- есть шина, в канал которой отправитель передаёт данные в формате JSON;
- 4 из 5 систем также принимают эти данные в JSON;
- а вот пятая система ожидает их уже в формате XML;
- в этом случае конвертация ляжет на шину.

С какими проблемами мы можем столкнуться при конвертации?
Для начала возьмём данные в формате XML и «в лоб» сконвертируем их в JSON:

<customer id="1001">
<name>Иван Иванов</name>
<age>30</age>
</customer>


{
"id": 1001,
"name": "Иван Иванов",
"age": 30
}

Продолжение в комментариях ⬇️⬇️⬇️
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍541
Всем привет!

В предыдущем посте мы остановились на некоторой абстрактной, академической задаче:
Типовая конфигурация: 1С:ERP

Входные данные — JSON.
Нужно:
- сконвертировать их в валидный XML;
- затем из полученного XML снова собрать JSON;
- ничего не потерять по дороге.


➡️ Сколько кода потребуется для решения такой задачи?

⬇️

А что, если я скажу, что хватит четырех?

СоответствиеИзJSON = ОбщегоНазначения.JSONВЗначение(ИсходныйJSON, , Истина);
СтрокаВВидеXML = ОбщегоНазначения.ЗначениеВСтрокуXML(СоответствиеИзJSON);

СноваСоответствие = ОбщегоНазначения.ЗначениеИзСтрокиXML(СтрокаВВидеXML);
ТотЖеСамыйJSON = ОбщегоНазначения.ЗначениеВJSON(СноваСоответствие);


"Это не честно!" - скажете вы.
"Конечно не честно" "есть нюанс" - скажу я 😅

Если воспроизвести этот алгоритм, и посмотреть на запись в XML, мы заметим - что мы описали не данные из сообщения JSON, а все сообщение целиком, включая структуру данных.
Этот пример приведен как один из вариантов решения подобных задач: мы использовали промежуточный DTO, который можно представить в обоих форматах.

Давайте подведем резюме:
▪️XML и JSON используют разные модели представления данных
▪️JSON допускает имена полей, невозможные в XML
▪️В XML всё строка - нам нужно позаботится о сохранении типов данных при конвертации
▪️Пространство имен, комментарии и прочая мета-информация требует отдельного представления в JSON
▪️Неплохой вариант - использовать DTO для конвертации
▪️Обратная совместимость накладывает существенные ограничения.

➡️Теперь же посмотрим, какие методики и инструмента для работы с данными в этих форматах есть у нас во встроенном языке

Тут можно выделить 3 подхода:

▪️Потоковый - читаем сообщение узел за узлом, не загружая его целиком в память. Хорошо для больших файлов. Минус: код сложнее и на каждой итерации нужно отслеживать контекст.

▪️Объектный - например ПрочитатьJSON, получаем Структуру или Массив - объекты встроенного языка. Код проще и нагляднее. однако, если в сообщении будет например два миллиона клиентов - ваше железо скорее всего не скажет вам "спасибо".

▪️Гибридный - сначала читаем потоком (например, до начала некоторого списка или массива), а когда дошли до объекта, читаем его через объектную модель. После его обработки читаемый следующий объект так же в объектной модели.
Кстати так работает типовой обмен БСП через универсальных формат EnterpriseData.

➡️Производительность

▪️Мне стало интересно, отличается ли производительность разных способов?
▪️Есть ли вообще смысл ее считать?

Я взял пару простых сообщений в каждом из форматов:
<?xml version="1.0" encoding="UTF-8"?>
<customers>
<customer id="1001">
<name>Иван Иванов</name>
<age>30</age>
</customer>
<customer id="1002">
<name>Мария Петрова</name>
<age>25</age>
</customer>
</customers>

{
"customers": [
{
"id": 1001,
"name": "Иван Иванов",
"age": 30
},
{
"id": 1002,
"name": "Мария Петрова",
"age": 25
}
]
}


Каждое из этих сообщений было прочитано разными способами:
▪️С помощью ФабрикаXDTO - ПрочитатьXML и ПрочитатьJSON
▪️ЧтениеXML (ЧтениеJSON).Прочитать() в цикле (Потоком)
▪️ПрочитатьJSON
▪️ПрочитатьЗначениеJSON

Было выполнено 1 000 000 итераций каждого сообщения каждым способом

Результат можно назвать интересным:
▪️ФабрикаXDTO и потоковое чтение с помощью Прочитать() в цикле - 50 ~ 65 с.
▪️ПрочитатьJSON() ~ 16 с.
▪️ПрочитатьЗначениеJSON() ~ 12 с.

Казалось бы, существенная разница, не правда ли?
Но, напомню - это на 1 000 000 итераций. Если у вас что-то и тормозит в интеграциях - то скорее всего не тут.

Продолжение в комментариях ⬇️⬇️⬇️
Please open Telegram to view this post
VIEW IN TELEGRAM
👍52🔥2
🔥 Андрей Соколов: «Как съесть XML с JSON, и не поперхнуться»

Как правильно работать с XML и JSON в 1С-интеграциях? Андрей Соколов (ведущий разработчик KORUS Consulting) разобрал оба формата с нуля — и это настоящая кладезь практики:

▶️Что внутри:

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

▶️Кому будет полезно:

Всем, кто хотя бы раз мучился с парсингом XML или JSON в 1С. Особенно — тем, кто проектирует интеграции с внешними системами.

▶️Смотреть:

🔜 YouTube: https://youtu.be/o8ras_BflLk

➡️ ВКонтакте: https://vkvideo.ru/video-232435421_456239041

Ставьте лайки, комментируйте, делитесь с коллегами — и следите за каналом: скоро выложу и другие доклады с Жёлтого клуба!

А какие темы интеграции вам были бы ещё интересны? Пишите в комментариях — соберём идеи для следующих встреч! 👇


#event@it_lunch

🔥 Подписывайся на IT Ланч!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍41👏1
Всем привет! 🖐

⭐️ Сейчас много разговоров о новом механизме «Очередь», представленном в платформе 8.5.4.
Вендор позиционирует его так:
С помощью очередей можно оптимизировать, например, проведение документов, разделив его на действия, выполняемые синхронно в обработчике проведения, и действия, которые обязательно будут выполнены позже. Запрос на выполнение отложенных действий оформляется в виде сообщения очереди.

И тут сложились звёзды: я понял, что пора рассказать вам, что… очереди в ERP уже есть 😁

➡️ Реализованы они в составе механизма ОтложенныеЗадания.
В него входят как специализированные очереди:
▪️ЗаданияКРасчетуНормативногоГрафикаПроизводства;
▪️ЗаданияКОтражениюЛимитовПоДаннымБюджетирования;
так и УниверсальнаяОчередьОперативныхЗаданий.

Именно о ней поговорим подробнее.

➡️ Как это работает:
▪️ Бизнес-код решает, что задачу нужно выполнить отложенно.
▪️ Вызывается метод постановки задания в очередь.
▪️ Механизм добавляет строку в регистр очереди.
▪️ Позже обработка запускается:
либо явно через ...Запустить(...);
либо регламентным заданием ВыполнениеОтложенныхЗаданий.
▪️ Управляющий поток выбирает задания из регистра.
▪️ Задания группируются по аналитике и разбиваются на порции.
▪️ Для каждой порции определяется метод выполнения.
▪️ Порция выполняется в текущем сеансе, в управляющем потоке или в рабочих фоновых потоках.
▪️ Успешные записи удаляются из очереди, а ошибки остаются для повторной попытки или фиксируются как окончательные.

➡️ Пример можно посмотреть в УчетНДСРФ.ЗарегистрироватьЗаданияАктуализацииСчетаФактуры.
Там используется:
▪️ УниверсальнаяОчередьОперативныхЗаданий.ДобавитьЗадание - добавляет задание в очередь и при необходимости инициирует запуск управляющего потока;
▪️ управляющий поток, в свою очередь, вызывает обработчик УчетНДСРФ.ОбновлениеСчетовФактурВыданных.

➡️ Доработать механизм достаточно просто.
Например:
▪️ Откройте перечисление ЗаданияУниверсальнойОчереди и добавьте новый элемент, например МоеНовоеЗадание.
▪️ Определите, где будет расположен метод обработки.
В общем случае обработчик лучше размещать там, где уже находится основная бизнес-логика процесса.
▪️ Реализуйте обработчик с сигнатурой:
Процедура ОбработатьМоеНовоеЗадание(
Задания,
ИдентификаторыНеОбработанныхЗаписей,
ДополнительныеСвойства = Неопределено) Экспорт

Для Каждого СтрокаЗадания Из Задания Цикл
Попытка
// Здесь основная бизнес-логика.
Исключение

ТекстОшибки = ОтложенныеЗадания.ТекстОшибкиВыполнения(
Новый Структура("Объект", Объект),
СтрокаЗадания,
ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));

ИдентификаторыНеОбработанныхЗаписей.Вставить(
СтрокаЗадания.ИдентификаторЗаписи,
ТекстОшибки);

КонецПопытки;
КонецЦикла;
КонецПроцедуры

▪️ Затем определите метод для нового задания.
В УниверсальнаяОчередьОперативныхЗаданий.ОчередиЗаданий нужно добавить по аналогии:
ДобавитьВложеннуюОчередь(
ТаблицаОчередей,
Перечисления.ЗаданияУниверсальнойОчереди.МоеНовоеЗадание,
"ИмяМодуля.ОбработатьМоеНовоеЗадание");

▪️ После этого задание можно ставить в очередь:
УниверсальнаяОчередьОперативныхЗаданий.ДобавитьЗадание(
СсылкаНаОбъект,
Перечисления.ЗаданияУниверсальнойОчереди.МоеНовоеЗадание);


Профит! 👍

Более сложные кейсы, вплоть до реализации собственной очереди отложенных заданий с многопоточностью, приоритетами и интервалами выполнения - можно посмотреть в общем модуле ОтложенныеЗадания.

ℹ️ Важный нюанс: выполнение отложенного задания может быть назначено сеансу пользователя, отличного от инициатора задания.
Например, пользователь Иванов обработает счёт-фактуру, хотя задание было поставлено пользователем Петров, при проведении РТиУ.

На этом сегодня всё. До связи! ✌️
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥127👍7
Всем привет!👋
Сегодня мемо по дружбе обменов: когда одни не хотят, а другие не могут
.

В большинстве случаев, при интеграции ERP ее нужно встроить в архитектурный зоопарк Заказчика, нередко включающий в себя legacy-системы.

Один из таких кейсов разберем сегодня.
Вводные данные:
Источник: УХ 1.4, EnterpriseData 1.3
Приёмник: внедряемая нами ERP 2.5, EnterpriseData 1.19

⭐️ Что сделали:

➡️Сначала перенесли XDTO-пакет нужной версии EnterpriseData.
Дальше подтянули из более свежей версии УХ несколько модулей, связанных с универсальным форматом:
▪️менеджер обмена через универсальный формат - МенеджерОбменаЧерезУниверсальныйФормат13;
▪️серверную логику обмена - ОбменДаннымиXDTOСервер.

➡️В логике отметки ключевых свойств правил конвертации добавили поддержку нового формата, чтобы для него использовалась перенесённая логика обмена.
Также пришлось точечно доработать типовой ОбменДаннымиXDTOСервер от версии УХ 1.4:
если используется формат ED 1.19, выполнение уходит в адаптированную серверную логику обмена - ОбменДаннымиXDTOСервер от свежей БСП.

⭐️ Почему это понадобилось?

Например:
▪️в XDTO-пакете появились свойства, реквизитов для которых в источнике просто нет, поэтому они выгружаются незаполненными;
▪️в ED 1.3 свойства табличных частей были представлены как Структура, а в ED 1.19 — уже как таблица значений;
▪️изменились ключевые свойства в пакетах, поэтому для ED 1.19 нужно отдельно вызывать логику отметки ключевых свойств правил конвертации.

➡️После этого пришлось почистить сам менеджер обмена.
▪️Из правил обработки данных и правил конвертации объектов убрали объекты, которых не было в нашем релизе УХ.
▪️Отдельно вырезали вызовы общих модулей из более свежей УХ, которых нет в УХ 1.4. Например:
▪️УниверсальныйОбменЗагрузкаАналитики
▪️РаботаСКурсамиВалютБПКлиентСервер
▪️ТуристическийНалогСервер
▪️УчетКассовымМетодом

➡️В серверной логике обмена XDTO (ОбменДаннымиXDTOСервер от свежей БСП) также убрали зависимости на механизмы из более свежей УХ: замеры, локализацию и вызовы стандартных подсистем (ОбщегоНазначения).

Не самый красивый путь, но вполне рабочий - особенно с учетом существенной экономии бюджета.

P. S. Кстати, этот кейс реализовали с Пашей.
Подпишитесь на него, если еще не подписаны.

А на этом сегодня все ✌️
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍42👏1
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍1🔥1