#Хештег_ПриНачалеРаботыСистемы😎
Привет!
Меня зовут Андрей Соколов, я разработчик 1С.
Говорят, у каждого разработчика есть папка «Сделать потом». Через полгода прокрастинации я открываю свою, и тут будет первый пост.
Почти как WebSocket-клиенты в 1С, только меня никто не ждал :)
Тут - самые страшные «монстры» из избранного, заметок и ночных кошмаров одинэсника.
Возможно, (но не обещаю) будет даже какой-то полезный контент - редкий и ценный, как адекватное ТЗ от Заказчика.
Да, чатика не будет - хватает рабочих 🙈
Привет!
Меня зовут Андрей Соколов, я разработчик 1С.
Говорят, у каждого разработчика есть папка «Сделать потом». Через полгода прокрастинации я открываю свою, и тут будет первый пост.
Почти как WebSocket-клиенты в 1С, только меня никто не ждал :)
Тут - самые страшные «монстры» из избранного, заметок и ночных кошмаров одинэсника.
Возможно, (но не обещаю) будет даже какой-то полезный контент - редкий и ценный, как адекватное ТЗ от Заказчика.
Да, чатика не будет - хватает рабочих 🙈
👍7❤2🔥2
#Хештег_оМонстроКлавишах
Когда я решил сменить профессию и уйти в разработку, я четко понимал что хочу работать именно с 1С. Документация на русском, русскоязычное сообщество, код кириллицей.
Для меня, который с английским на «вы», это подходило. И, честно говоря, мне вести разработку на родном языке в кайф. Понимание сущностей, интерфейсов, абстракций - оно попроще, когда ты носитель языка)
Но не обошлось и без ложки дёгтя. В нашем случае - это спецсимволы: «&», «#», квадратные «[ ]» и угловые «<>» скобки. Они-то ладно, мышечная память быстро осваивает ввод через Alt. Но вот ЕСТЬNULL. Считали, сколько клавиш надо нажать, чтобы набрать ЕСТЬNULL в стандартной раскладке? А сколько раз его нужно использовать в среднестатистическом запросе с соединениями?
Проблема ещё была в том, что у меня был «зоопарк» подключений. Просьбы «а поставьте программку..» часто заканчивались «мальчик, иди отсюда», а покупать скриптовую клаву не хотелось.
Тогда меня спас AutoHotkey. Portable-версия, файл настроек с одной строкой и готово: «естьнал» превращается в «ЕСТЬNULL». Без вникания, «а что он там ещё может».
В начале этого года вместо зоопарка клиентских удалённых рабочих столов появился один, свой, родной (ну, почти). Так я вернулся к местами забытой, но не потерявшей актуальности раскладке «Чистова». Только вот спустя полгода сожительства с ней, при запуске проекта и переезде на новый «уютный» рабочий стол (в родных корпоративных пенатах🥺 ) услышал забытое, но привычное «Мы не поставим это». А руки-то ее уже просят, уже привыкли!
Затащила старая добрая классика - AutoHotkey снова в деле. Наконец-то, я немного разобрался в механике работы скриптов - даже навайбшкодил и теперь тешу своё ОКР - у меня есть горячие клавиши, выравнивающие текст по знакам равно и запятой по центру.
О чем вообще этот спитч? - цените своё время. Даже те доли секунды, которые вы тратите на ввод ЕСТЬNULL, можно потратить на что-то более интересное.Ну или на пиво
И кстати: респект разработчикам 1С:Элемент, там спецсимволы через Alt поддерживаются из коробки. Уж не знаю, притащенно это из Theia, или кто-то так же устал от них, как я 😁
Хочешь, сделаю из этого полноценный пост для блога или статьи? #непалимся
Когда я решил сменить профессию и уйти в разработку, я четко понимал что хочу работать именно с 1С. Документация на русском, русскоязычное сообщество, код кириллицей.
Для меня, который с английским на «вы», это подходило. И, честно говоря, мне вести разработку на родном языке в кайф. Понимание сущностей, интерфейсов, абстракций - оно попроще, когда ты носитель языка)
Но не обошлось и без ложки дёгтя. В нашем случае - это спецсимволы: «&», «#», квадратные «[ ]» и угловые «<>» скобки. Они-то ладно, мышечная память быстро осваивает ввод через Alt. Но вот ЕСТЬNULL. Считали, сколько клавиш надо нажать, чтобы набрать ЕСТЬNULL в стандартной раскладке? А сколько раз его нужно использовать в среднестатистическом запросе с соединениями?
Проблема ещё была в том, что у меня был «зоопарк» подключений. Просьбы «а поставьте программку..» часто заканчивались «мальчик, иди отсюда», а покупать скриптовую клаву не хотелось.
Тогда меня спас AutoHotkey. Portable-версия, файл настроек с одной строкой и готово: «естьнал» превращается в «ЕСТЬNULL». Без вникания, «а что он там ещё может».
В начале этого года вместо зоопарка клиентских удалённых рабочих столов появился один, свой, родной (ну, почти). Так я вернулся к местами забытой, но не потерявшей актуальности раскладке «Чистова». Только вот спустя полгода сожительства с ней, при запуске проекта и переезде на новый «уютный» рабочий стол (в родных корпоративных пенатах
Затащила старая добрая классика - AutoHotkey снова в деле. Наконец-то, я немного разобрался в механике работы скриптов - даже навайбшкодил и теперь тешу своё ОКР - у меня есть горячие клавиши, выравнивающие текст по знакам равно и запятой по центру.
О чем вообще этот спитч? - цените своё время. Даже те доли секунды, которые вы тратите на ввод ЕСТЬNULL, можно потратить на что-то более интересное.
И кстати: респект разработчикам 1С:Элемент, там спецсимволы через Alt поддерживаются из коробки. Уж не знаю, притащенно это из Theia, или кто-то так же устал от них, как я 😁
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14❤3👍3
Как-то незаметно быстро пролетели два месяца с последнего (первого) поста. Сегодня, вместе с ветром и осенним обострением, хочется накинуть на вентилятор.
Давайте зададим вопрос ИИ:
И возьмем пока за аксиому ответ:
Года два-три назад в нашем коллективе родился термин "Доработчик". "Доработчик" - это не программист из определения выше, а что-то другое. Он выкручивается из ситуации, не задавая лишних вопросов: ему сказали - он сделал. Зачем, почему, для кого - это уже философия, а философия в его спринтах не предусмотрена.
Парадокс в том, что роль "доработчика" кажется удобной на первый взгляд. Нет амбиций - нет разочарований. Нет вопросов - нет конфликтов. Но именно эта позиция становится потолком для профессионального роста. Разработчик (в нашем определении) не просто исполняет поставленную задачу - он понимает архитектуру, видит подводные камни, предлагает альтернативы. Он становится не исполнителем, а советником для бизнеса.
Прост ли путь из доработчиков в разработчики? Нет. Это требует любопытства. Это требует смелости задавать вопросы, которые кажутся неудобными. Это требует готовности принять ответственность не только за код и программу, а за результат работы людей и компании.
Банально звучит, да? "Просто будь любознательным." Но дело в том, что любопытство - это не врожденное качество. Это выбор, который делается каждый день: потратить лишние пятнадцать минут на изучение чужого кода или идти дальше, потому что спешишь.
Любопытство - это готовность копать глубже, даже когда очевидного ответа хватило бы. Это означает делать код-ревью коллег не потому, что ты обязан, а потому, что хочешь понять, как они думают. Это значит разбираться в том, как работает решение, а не просто применять готовый рецепт. Это требует времени. Это требует энергии. И да, это противоречит спринту, где нужно сдать три задачи до пятницы.
Но вот вам еще один парадокс: специалист, который задает вопросы, в конечном итоге решает задачи быстрее и качественнее. Потому что не тратит время на переделывание неправильно понятой задачи и не упирается в непредвиденные проблемы на середине спринта - он понимает контекст.
Понимание контекста часто требует задавать неудобные вопросы. И вот здесь начинается самое интересное. "Неудобные вопросы" часто косвенно указывают на то, что кто-то накосячил. "А может быть, мы неправильно подошли к этой архитектуре?" - и вот вся архитектура вдруг выглядит как груда говна, которую нужно переделывать. Они могут означать, что спринт нужно пересчитать - а это значит, что кто-то будет объяснять на уровне выше, почему график сорвался.
Именно поэтому вторая составляющая профессионализма - это смелость. Смелость - это не отсутствие страха, это действие несмотря на страх. Это когда ты понимаешь, что молчание хуже. Что неправильное решение, которое ты тихо реализовал, обойдется компании дороже, чем десятиминутный конфликт с лидом, РП или ведущим.
Эта смелость неразрывно связана с третьей составляющей - готовностью принять ответственность. Не только за код, а за результат. Что произойдет, когда данных станет в сто раз больше? Как это повлияет на остальную систему? Это означает больше работы. Это означает, что ты не можешь просто уйти с работы, когда код залил. Это означает, что ты берешь на себя риск. Если что-то сломается, ты не сможешь сказать: "Так была поставлена задача". Потому что ты отвечаешь за реальный результат, а не за буквальное выполнение инструкции.
И ирония в том, что самый "ленивый" путь (просто делай, что сказали) на деле требует больше сил в долгосрочной перспективе - ты застреваешь на одном месте, твоя ценность падает, проекты становятся скучными, а рынок проходит мимо - чем путь к профессионализму, который кажется тяжелее. Потому что первый ведет в никуда, а второй - куда-то.
Давайте зададим вопрос ИИ:
Кто такой программист и кто такой разработчик? Чем эти понятия отличаются друг от друга?
И возьмем пока за аксиому ответ:
Программист сосредоточен на написании кода по заданию, в то время как разработчик отвечает за весь процесс работы над продуктом, от проектирования до реализации.
Года два-три назад в нашем коллективе родился термин "Доработчик". "Доработчик" - это не программист из определения выше, а что-то другое. Он выкручивается из ситуации, не задавая лишних вопросов: ему сказали - он сделал. Зачем, почему, для кого - это уже философия, а философия в его спринтах не предусмотрена.
Парадокс в том, что роль "доработчика" кажется удобной на первый взгляд. Нет амбиций - нет разочарований. Нет вопросов - нет конфликтов. Но именно эта позиция становится потолком для профессионального роста. Разработчик (в нашем определении) не просто исполняет поставленную задачу - он понимает архитектуру, видит подводные камни, предлагает альтернативы. Он становится не исполнителем, а советником для бизнеса.
Прост ли путь из доработчиков в разработчики? Нет. Это требует любопытства. Это требует смелости задавать вопросы, которые кажутся неудобными. Это требует готовности принять ответственность не только за код и программу, а за результат работы людей и компании.
Банально звучит, да? "Просто будь любознательным." Но дело в том, что любопытство - это не врожденное качество. Это выбор, который делается каждый день: потратить лишние пятнадцать минут на изучение чужого кода или идти дальше, потому что спешишь.
Любопытство - это готовность копать глубже, даже когда очевидного ответа хватило бы. Это означает делать код-ревью коллег не потому, что ты обязан, а потому, что хочешь понять, как они думают. Это значит разбираться в том, как работает решение, а не просто применять готовый рецепт. Это требует времени. Это требует энергии. И да, это противоречит спринту, где нужно сдать три задачи до пятницы.
Но вот вам еще один парадокс: специалист, который задает вопросы, в конечном итоге решает задачи быстрее и качественнее. Потому что не тратит время на переделывание неправильно понятой задачи и не упирается в непредвиденные проблемы на середине спринта - он понимает контекст.
Понимание контекста часто требует задавать неудобные вопросы. И вот здесь начинается самое интересное. "Неудобные вопросы" часто косвенно указывают на то, что кто-то накосячил. "А может быть, мы неправильно подошли к этой архитектуре?" - и вот вся архитектура вдруг выглядит как груда говна, которую нужно переделывать. Они могут означать, что спринт нужно пересчитать - а это значит, что кто-то будет объяснять на уровне выше, почему график сорвался.
Именно поэтому вторая составляющая профессионализма - это смелость. Смелость - это не отсутствие страха, это действие несмотря на страх. Это когда ты понимаешь, что молчание хуже. Что неправильное решение, которое ты тихо реализовал, обойдется компании дороже, чем десятиминутный конфликт с лидом, РП или ведущим.
Эта смелость неразрывно связана с третьей составляющей - готовностью принять ответственность. Не только за код, а за результат. Что произойдет, когда данных станет в сто раз больше? Как это повлияет на остальную систему? Это означает больше работы. Это означает, что ты не можешь просто уйти с работы, когда код залил. Это означает, что ты берешь на себя риск. Если что-то сломается, ты не сможешь сказать: "Так была поставлена задача". Потому что ты отвечаешь за реальный результат, а не за буквальное выполнение инструкции.
И ирония в том, что самый "ленивый" путь (просто делай, что сказали) на деле требует больше сил в долгосрочной перспективе - ты застреваешь на одном месте, твоя ценность падает, проекты становятся скучными, а рынок проходит мимо - чем путь к профессионализму, который кажется тяжелее. Потому что первый ведет в никуда, а второй - куда-то.
🔥12👍6❤4🤝1
Комбинации1С.png
669.8 KB
#МамаЯВТелевизоре
Всем привет!
Где-то вот сейчас я начал свой доклад в Клубе питерских одинэсников, «закрывая гештальт» по теме горячих клавиш.
Я надеюсь, что вы сейчас слушаете мой доклад, а не читаете это сообщение 😁
По сложившейся традиции - оставляю ссылки на материалы, озвученные в рамках доклада.
1. Раскладка Павла Чистова
2. Microsoft Keyboard Layout Creator
3. AutoHotkey
Если вам не удалось попасть на встречу - можете присоединится онлайн, а для самых ленивых - через некоторое время тут будет текстовая версия доклада.
Ну, и обещанная шпаргалка по комбинациям клавиш в 1С - прикреплена.
Всем✌️
Всем привет!
Где-то вот сейчас я начал свой доклад в Клубе питерских одинэсников, «закрывая гештальт» по теме горячих клавиш.
Я надеюсь, что вы сейчас слушаете мой доклад, а не читаете это сообщение 😁
По сложившейся традиции - оставляю ссылки на материалы, озвученные в рамках доклада.
1. Раскладка Павла Чистова
2. Microsoft Keyboard Layout Creator
3. AutoHotkey
Если вам не удалось попасть на встречу - можете присоединится онлайн, а для самых ленивых - через некоторое время тут будет текстовая версия доклада.
Ну, и обещанная шпаргалка по комбинациям клавиш в 1С - прикреплена.
Всем
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16❤9👍8
HotKeys.pdf
3.8 MB
#Послевкусие
Нашел время сесть и проанализировать свой доклад в пятницу.
Признаюсь, не удалось рассказать его так как хотел, все-таки опыта публичных выступлений маловато 😉
Опыт - сын ошибок трудных, так что новых выступлений не избежать 😁
Как оказалось, тема осталась не до конца раскрытой, а значит серии постов про горячие клавиши - быть!
Хочу поблагодарить Иосифа, Таню и весь орг. комитет Клуба: без вас ничего бы не получилось!🫶
Всем кто был, лично или онлайн - спасибо за вашу поддержку и фидбек! 💪
И по просьбам:
Игоря - версия шпаргалки в pdf;
Романа - комментарии к посту✍️
Нашел время сесть и проанализировать свой доклад в пятницу.
Признаюсь, не удалось рассказать его так как хотел, все-таки опыта публичных выступлений маловато 😉
Опыт - сын ошибок трудных, так что новых выступлений не избежать 😁
Как оказалось, тема осталась не до конца раскрытой, а значит серии постов про горячие клавиши - быть!
Хочу поблагодарить Иосифа, Таню и весь орг. комитет Клуба: без вас ничего бы не получилось!
Всем кто был, лично или онлайн - спасибо за вашу поддержку и фидбек! 💪
И по просьбам:
Игоря - версия шпаргалки в pdf;
Романа - комментарии к посту
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤🔥12🔥9
Всем привет!
Как и обещал, в небольшой серии постов мы поговорим о горячих клавишах.
Ловите первую подборку для навигации⬇️
1. Найти в дереве »
Позволяет мгновенно перейти к объекту в дереве конфигурации, чье окно сейчас открыто перед вами.
2. Перейти к строке »
Вам скинули текст ошибки с номером строки? Не надо искать метод и листать его код колесиком мыши - нажали, вбили номер, вы на месте.
3. Перейти к свойствам объекта »
Крайне удобная фича! При работе с реквизитами объектов и элементами формы - просто незаменимо.
А если используете вкладки (группы) на панели свойств, то переключать можно этими сочетаниями.
4. Поиск »
Ну, тут всё понятно. База.
Но есть еще для ускорения:
Найти следующий »
Найти предыдущий »
А вот это многие забывают, хотя штука полезнейшая для поиска мест использования переменных или вызовов методов:
Искать выделенный фрагмент дальше по тексту »
Искать выделенный фрагмент в обратном направлении »
Без вызова диалогового окна поиска. Мелочь, а приятно.
5. Глобальный поиск »
Может, не самый быстрый инструмент, но когда нужно прочесать файлы или конкретные подсистемы - bellissimo. Гибкая настройка области поиска решает.
И к нему же вишенка на торте:
6. Результаты глобального поиска »
Эта комбинация возвращает вас к окну с результатами предыдущих поисков. Чтобы не запускать поиск заново, когда случайно закрыл окно. Там, кстати, еще история поиска есть.
👍 - если узнали что-то новое
🤝 - если не в этот раз
🔥 - если всё равно будешь тыкать мышкой, потому что ты у мамы снайпер
Как и обещал, в небольшой серии постов мы поговорим о горячих клавишах.
Ловите первую подборку для навигации
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🤝4❤3
Тема старая (навигация) - клавиши новые
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
👍14❤3🔥3🤝2
Всем привет! ✌️
Сегодня закроем тему горячих клавиш последней подборкой.
Поехали!
Закладки📑
Полезный и удобный функционал, если нужно часто перемещаться между одними и теми же блоками кода.
Установить/снять закладку »
Помечаешь место в коде, которое потом нужно будет найти. Особенно полезно, когда нужно вернуться к нескольким местам в модуле.
Следующая закладка »
Перемещаешься на следующую метку.
Предыдущая закладка »
Возвращаешься на предыдущую метку.
Перемещение по закладкам, соответственно, зациклено
Редактор управляемых форм🖼
Крайне удобные комбинации для перемещения в редакторе:
Форма »
Модуль »
Элементы »
Реквизиты »
Команды »
Командный интерфейс »
Параметры »
Буфер обмена и калькулятор🔢
Удобная фишка в режиме предприятия, когда нужно посчитать сумму нескольких строк в колонке
Добавить к буферу обмена »
Вычесть из буфера обмена »
Открыть калькулятор »
Отладка▶️
Начать/продолжить отладку »
Перезапуск приложения для отладки »
Запуск приложения без отладки »
Прекратить отладку »
Шагнуть в »
Шагнуть через »
Шагнуть из »
Идти до курсора »
Установить/снять точку останова »
Просто приятные мелочи🔧
Удалить текущую строку »
Так же будет работать с несколькими строками, если они выделены. По сравнению с Backspace и Delete фишка в том, что удаляет строку целиком, даже если выделена только часть.
Проверка модуля »
Обновить конфигурацию базы данных »
Очистить служебные сообщения »
Закрыть служебные сообщения »
Ну вот, друзья.
Не ставил задачи полностью пересказать справку по горячим клавишам, выбирал те что использую сам и на мой взгляд наиболее полезные👍
Весь список есть в справке к платформе, скомпоновал его в удобном виде в png и pdf.
P.S. Недавно наткнулся на интересный пост про горячие клавиши Windows, что-то из списка утащил к себе в применение.
👍 - если узнали что-то новое
🤝 - если не в этот раз
🔥 - если сэкономленные секунды потратишь на пятничное пиво
#1C_Shortcuts
Сегодня закроем тему горячих клавиш последней подборкой.
Поехали!
Закладки
Полезный и удобный функционал, если нужно часто перемещаться между одними и теми же блоками кода.
Установить/снять закладку »
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👍5❤1🤝1
Всем привет! 🖐
Пока лонгриды пишутся(и удаляются), запускаю рубрику #ПодКапотомERP.
В ней посмотрим как на программный интерфейс, так и на некоторые механизмы флагманского решения: какие инструменты уже лежат в коробке, чтобы не изобретать велосипеды.
На «операционном столе» - ERP 2.5.22.132, первым обследуем программный интерфейс модуля
Вокруг него есть загадка: переедут ли эти методы в БСП или так и останутся жить в ERP?
Спойлер: никто не знает. Но пользоваться ими можно уже здесь и сейчас.
Мой топ методов:
➡️
Сборная солянка в документах-основаниях? Привет, Транспортная накладная 👋.
Метод раскладывает массив ссылок по полочкам (типам). Крайне удобно, чтобы собрать динамический запрос. Привет стандарту 437!
➡️
Маст-хэв. Серьезно. Имя метода говорит сама за себя
➡️
Возвращает описание типов по переданному типу. Хорош, если не пользуетесь Конструктором описания типов
➡️
Если переданная ссылка пустая - вернет значение по умолчанию для этого типа.
⚠️ Нюанс: С составными полями магии не ждите, возвращает
➡️
Если значение имеет тип, отличный от
➡️
Да, да, пауза! 🥲
⚠️ Важно: Использовать только в фоновом задании.
➡️
Сравнивает две ТЗ построчно, как отдельно по колонкам, там и по ее содержимому.
➡️
Все знают проможет и не надо? 😁
⚠️ Важно: Метод типизирует колонки по типам в первой структуре массива.
➡️
Удобный интерфейс для удаления строк в ТЗ.
Но не забывайте, что оптимальный способ удаления зависит от объема удаляемых строк, подробности - тут.
➡️
Вернут массив дней в период / разницу между двумя датами
➡️
При "жонглировании" структурами / соответствиями
Конечно, помимо
Так например, в
Загляните внутрь, прежде чем писать очередной "Универсальный механизм". Возможно, 1С это уже написала за вас.
Знали про эти методы или пишете свои?
👍 - узнали что-то новое
🤝 - не в этот раз
🔥 - пишу свои велосипеды, так надежнее
Пока лонгриды пишутся
В ней посмотрим как на программный интерфейс, так и на некоторые механизмы флагманского решения: какие инструменты уже лежат в коробке, чтобы не изобретать велосипеды.
На «операционном столе» - ERP 2.5.22.132, первым обследуем программный интерфейс модуля
ОбщегоНазначенияУТ.Вокруг него есть загадка: переедут ли эти методы в БСП или так и останутся жить в ERP?
Спойлер: никто не знает. Но пользоваться ими можно уже здесь и сейчас.
Мой топ методов:
СоответствиеМассивовПоТипамОбъектов Сборная солянка в документах-основаниях? Привет, Транспортная накладная 👋.
Метод раскладывает массив ссылок по полочкам (типам). Крайне удобно, чтобы собрать динамический запрос. Привет стандарту 437!
ПерваяСтрокаРезультатаЗапросаВСтруктуру Маст-хэв. Серьезно. Имя метода говорит сама за себя
ОписаниеТиповПоТипу Возвращает описание типов по переданному типу. Хорош, если не пользуетесь Конструктором описания типов
ЗначенияРеквизитовОбъектаПоУмолчанию Если переданная ссылка пустая - вернет значение по умолчанию для этого типа.
⚠️ Нюанс: С составными полями магии не ждите, возвращает
Неопределено.ЗначениеРеквизитаОбъектаТипаБулево Если значение имеет тип, отличный от
Булево - вернет Ложь.Пауза Да, да, пауза! 🥲
⚠️ Важно: Использовать только в фоновом задании.
СравнитьТаблицыЗначений Сравнивает две ТЗ построчно, как отдельно по колонкам, там и по ее содержимому.
МассивВТаблицуЗначений Все знают про
ТаблицаЗначенийВМассив из ОбщегоНазначения, но не про обратную конвертацию. ⚠️ Важно: Метод типизирует колонки по типам в первой структуре массива.
НайтиИУдалитьСтрокиТаблицыЗначений и УдалитьСтрокиТаблицыУдобный интерфейс для удаления строк в ТЗ.
Но не забывайте, что оптимальный способ удаления зависит от объема удаляемых строк, подробности - тут.
МассивДатИзПериода и РазностьДатВернут массив дней в период / разницу между двумя датами
КлючКоллекцииПоЗначению, ПоменятьКлючИЗначениеКоллекцииПри "жонглировании" структурами / соответствиями
Конечно, помимо
ОбщегоНазначенияУТ есть клиентский и клиент-серверный модули.Так например, в
ОбщегоНазначенияУТКлиентСервер есть раздел ПреобразованиеТиповДанных для работы с массивами, структурами и прочими типами.Загляните внутрь, прежде чем писать очередной "Универсальный механизм". Возможно, 1С это уже написала за вас.
Знали про эти методы или пишете свои?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥5❤🔥3🤓2
Всем привет! 🖐
Продолжаем рубрику #ПодКапотомERP
Сегодня "обследуем" сразу несколько механизмов, поехали!
⭐️ Первыми будут общие модули "семейства"
Натурально "хлеб с маслом" для программной работы с СКД.
➡️ Для параметров:
➡️ Отборов:
➡️ Для оформления, обработки полей и группировок -
Долгое время🥹
И да, я не ошибся, указав
⭐️ Вот, кстати, еще один представитель общих модулей с повторным использованием возвращаемых значений, предоставляющих его:
Этот модуль содержит большое количество методов для обращения к элементам "по-умолчанию".
➡️ Склад, организация, банковский счет контрагента или организации, и многое другое.
В большинстве случаев реализация внутри вызывает типовые методы, вроде
⭐️ Третьим сегодня будет модуль менеджера справочника
Ходит слух, что еще не все знают, как пересчитывать коэффициенты упаковок в запросах 😁
Модуль менеджера дает возможность как определять тексты запроса упаковок:
➡️
➡️
➡️
так и при обработке на встроенном языке обращаться к этим данным:
➡️
➡️
А на этом сегодня все🤘
Знали про эти методы или пишете свои?
👍 - узнали что-то новое
🤝 - не в этот раз
🔥 - вендор опять все поменяет в следующем релизе
Продолжаем рубрику #ПодКапотомERP
Сегодня "обследуем" сразу несколько механизмов, поехали!
КомпоновкаДанных. (КомпоновкаДанныхКлиентСервер, КомпоновкаДанныхКлиент, КомпоновкаДанныхСервер, КомпоновкаДанныхПовтИсп).Натурально "хлеб с маслом" для программной работы с СКД.
УстановитьПараметр / ПолучитьПараметр;ДобавитьОтбор / УдалитьОтбор, ДобавитьГруппуОтбора;ДобавитьВыбранноеПоле, ДобавитьГруппировку, ДобавитьОформляемоеПоле.Долгое время
КомпоновкаДанныхКлиентСервер был только в УТКАУП, а в "обделенную" УНФ его приходилось тащить самостоятельно. Однако в последнем релизе увидел его, пусть и в урезанном варианте. Спасибо разработчикам УНФ И да, я не ошибся, указав
КомпоновкаДанныхПовтИсп, т.к. он тоже предоставляет программный интерфейс.ЗначениеНастроекПовтИспЭтот модуль содержит большое количество методов для обращения к элементам "по-умолчанию".
В большинстве случаев реализация внутри вызывает типовые методы, вроде
Справочники.Организации.ПолучитьОрганизациюПоУмолчанию, обеспечивая задачу кеширования.УпаковкиЕдиницыИзмерения.Ходит слух, что еще не все знают, как пересчитывать коэффициенты упаковок в запросах 😁
Модуль менеджера дает возможность как определять тексты запроса упаковок:
ТекстЗапросаКоэффициентаУпаковкиТекстЗапросаВесУпаковкиТекстЗапросаОбъемУпаковкитак и при обработке на встроенном языке обращаться к этим данным:
КоэффициентыУпаковокКоэффициентВесОбъемПрочиеРеквизитыУпаковкиА на этом сегодня все
Знали про эти методы или пишете свои?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14👏4🤩4
Forwarded from Желтый клуб Питер
Всем привет! Рассказываем про наших спикеров!
🔥 Андрей Соколов, ведущий разработчик, Корус Консалтинг
В своем выступлении «Как съесть XML с JSON, и не поперхнуться» Андрей разберет ключевые отличия форматов, а также определит их роль в современной разработке. Мы выясним разницу между потоковой и объектной обработкой, обсудим выбор формата для разных задач, и даже попробуем сломать 1С в поисках «пасхалок». Из доклада узнаем какие инструменты есть во встроенном языке для работы с ними и подискутируем, когда выбрать XML, а когда — JSON.
👇 Подробности и регистрация:
https://yellowspb.timepad.ru/event/3808242/
В своем выступлении «Как съесть 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
⭐️ Начнем с общего модуля
➡️
➡️
➡️
Все это - удобный интерфейс для манипуляций связкой Партнер - Контрагент и иерархией Партнеров.
➡️ Когда-то может и "потеряшка"
⭐️ Дальше у нас
➡️
➡️
➡️
➡️
Как же много "Получить" в этом посте 😁
Тем не менее, методы от этого менее полезными не становятся🙃
➡️
⭐️ Еще один интересный зверь - общий модуль
Знаю много противников использования схем, скажете что даю вредные советы и будете правы - но я не смог обойти его мимо 😁
➡️
❗️ Обратите внимание, что возвращаемое значение - Структура, описание точки схемы запроса, выбирающего данные.
Ну совершенно точно следует раскурить этот модуль целиком )
➡️
➡️
➡️
Используйте с умом😉
А на этом сегодня все🤘
Знали про эти методы или пишете свои?
👍 - узнали что-то новое
🤝 - не в этот раз
🔥 - у меня свой велопарк, зато без "Получить" без именах методов
Продолжаем ковырять типовую конфигурацию в рубрике #ПодКапотомERP
ПартнерыИКонтрагенты.ПолучитьКонтрагентаПартнераПоУмолчаниюПолучитьВсехКонтрагентовПартнераПолучитьНижестоящихПартнеровВсе это - удобный интерфейс для манипуляций связкой Партнер - Контрагент и иерархией Партнеров.
ДенежныеСредстваСервер.ПолучитьПартнераПоКонтрагенту найдет путь к своим собратьям.РаботаСКурсамиВалютУТПолучитьКоэффициентПересчетаИзВалютыВВалютуПолучитьКурсВалютыПолучитьКоэффициентыПересчетаВалютыПересчитатьВВалютуКак же много "Получить" в этом посте 😁
Тем не менее, методы от этого менее полезными не становятся
СформироватьСуммуПрописью - хотя я думаю, что те кто часто делают печатные формы, и так с ним уже знакомы.СхемыЗапросов.Знаю много противников использования схем, скажете что даю вредные советы и будете правы - но я не смог обойти его мимо 😁
НайтиЗапросРезультата - Находит в схеме первый запрос, выбирающий результативные данные (то есть, не создающий и не уничтожающий временные таблицы). Ну совершенно точно следует раскурить этот модуль целиком )
УстановитьПомещениеВоВременнуюТаблицу - Устанавливает ключевое слово ПОМЕСТИТЬ и имя временной таблицы в текст запросаУстановитьИндексациюПолейЗапроса - Устанавливает индексацию в выборкеУстановитьВыборкуРазрешенныхЗаписей, УстановитьВыборкуРазрешенныхЗаписейВоВсемЗапросе - Устанавливает в секцию ВЫБРАТЬ ключевое слово "РАЗРЕШЕННЫЕ" Используйте с умом
А на этом сегодня все
Знали про эти методы или пишете свои?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15👏4❤3🙏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🤝3⚡1
Всем привет 🖖
Год назад у нас на проекте внедрения ERPУХ случилась маленькая, но показательная "авария".
Решил её записать, пока детали ещё более‑менее живут в памяти.
▪️ Доставку таких изменений, как создание и заполнение служебных справочников, ПВХ и прочих объектов, мы завязали на типовой механизм обновления информационной базы из БСП.
▪️ Схема стандартная и понятная: Пишем обработчики обновления, которые создают нужные объекты (изменяют документы, движения, заполняют базу данных и т.д. - нужное подчеркнуть), и поднимаем версию сборки. Подсистема сравнивает версии в конфигурации и в базе, если не совпадает, запускает обновление.
▪️ Сами обработчики могут отрабатывать монопольно, отложенно, с многопоточкой и прочими радостями жизни. У нас тоже всё шло по плану, пока в один прекрасный момент обновление не стало периодически завершаться с ошибкой на типовом обработчике УХ:
После этого с той же ошибкой обваливалась запись в служебный регистр подсистемы обновления. То есть падал не только конкретный обработчик - разваливался весь процесс обновления.
При этом поднималась версия сборки в регистре "Версии подсистем", и при перезапуске сеанса обновление уже не запускалось.
▪️ Понятно, что в одном из обработчиков запускалось фоновое задание, делающее монопольный режим не таким уж и монопольным.
Что за обработчик? Как и зачем он запускает фоновое задание?Кому оторвать руки - а так же множество других вопросов крутилось в голове.
▪️ Разумеется, проблема под пристальным наблюдением отладчика ошибка у нас попросту не воспроизводилась, да и в целом поведение ошибки было похоже на мерцательную аритмию - воспроизводясь один раз на 5 запусков обновления.
Чтож, одеваем гидрокостюм и заныриваем поглубже в пучину механизма обновления.
Погрузившись, опредилили два факта:
1. Так как обработчики нашей подсистемы выполняются целиком и полностью - в регистре "Версии подсистем" устанавливается новая версия нашей подсистемы.
Зависимых от нас подсистем в сборке нет, а следовательно - при перезапуске нет и причин повторять процедуру обновления, несмотря на то, что она после нас обновление завершилось с ошибкой.
2. Как говорится, "главное в расследовании не выйти на самих себя".
Фоновое задание запускалось не из какого‑то «хитрого» кода обновления. Оно стартовало при записи элемента нетипового справочника.
В нем была включена платформенная история изменений и стоял флаг «Обновлять историю данных сразу после записи».
Сценарий получался такой:
1. Обработчик записывает элемент справочника;
2. Платформа тут же пытается записать историю изменений, запуская фоновое задание;
3. Механизм обновления успевает обработать успешное завершение подсистемы, обновив версию в регистре;
4. Обработчики основной конфигурации, выполняющиеся после нас, ловят блокировку от фонового задания;
5. При перезапуске все сборки совпадают в конфигурации и базе данных, обновление не запускается.
▪️ Какая мораль?
Лишний (не до конца разобранный / не понятый) флажок сегодня - ночные танцы с обновлением завтра.
Это напоминает про простой принцип: система не обязана совпадать с нашими ожиданиями. Она честно делает то, что ты мы ей разрешаем, а не то, что имеем в виду.
А на этом сегодня все, до связи!✌️
Год назад у нас на проекте внедрения ERPУХ случилась маленькая, но показательная "авария".
Решил её записать, пока детали ещё более‑менее живут в памяти.
Конфликт блокировок при выполнении транзакции
Ошибка блокировки области данных
…
База данных заблокирована
компьютер: 1c-erp-dev, пользователь: Администратор, сеанс: 11,
начат: 06.03.2025 10:02:19, приложение: Фоновое задание
После этого с той же ошибкой обваливалась запись в служебный регистр подсистемы обновления. То есть падал не только конкретный обработчик - разваливался весь процесс обновления.
При этом поднималась версия сборки в регистре "Версии подсистем", и при перезапуске сеанса обновление уже не запускалось.
Что за обработчик? Как и зачем он запускает фоновое задание?
Чтож, одеваем гидрокостюм и заныриваем поглубже в пучину механизма обновления.
Погрузившись, опредилили два факта:
1. Так как обработчики нашей подсистемы выполняются целиком и полностью - в регистре "Версии подсистем" устанавливается новая версия нашей подсистемы.
Зависимых от нас подсистем в сборке нет, а следовательно - при перезапуске нет и причин повторять процедуру обновления, несмотря на то, что она после нас обновление завершилось с ошибкой.
2. Как говорится, "главное в расследовании не выйти на самих себя".
Фоновое задание запускалось не из какого‑то «хитрого» кода обновления. Оно стартовало при записи элемента нетипового справочника.
В нем была включена платформенная история изменений и стоял флаг «Обновлять историю данных сразу после записи».
Сценарий получался такой:
1. Обработчик записывает элемент справочника;
2. Платформа тут же пытается записать историю изменений, запуская фоновое задание;
3. Механизм обновления успевает обработать успешное завершение подсистемы, обновив версию в регистре;
4. Обработчики основной конфигурации, выполняющиеся после нас, ловят блокировку от фонового задания;
5. При перезапуске все сборки совпадают в конфигурации и базе данных, обновление не запускается.
Лишний (не до конца разобранный / не понятый) флажок сегодня - ночные танцы с обновлением завтра.
Это напоминает про простой принцип: система не обязана совпадать с нашими ожиданиями. Она честно делает то, что ты мы ей разрешаем, а не то, что имеем в виду.
А на этом сегодня все, до связи!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍8✍5
Всем привет! 🖐
Это текстовая версия доклада из Жёлтого клуба. Кто пропустил: ссылки на материалы - тут.
➡️ Начнём с вопроса: зачем нам вообще это знать?
Любая мало-мальски живая база - не изолированный остров.
Сайт с каталогом и заказами, 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:
- данные описываются с помощью объектов и массивов;
- корневым может быть любой элемент;
- типов больше: помимо строк есть числа, булевы значения и
- ограничений на имена полей значительно меньше. Хотя пустые или неуникальные ключи всё равно лучше не использовать: заранее неизвестно, как это трактует получатель сообщения.
➡️ Про типизацию, схемы и контракты
Мы уже знаем, что в XML все данные по умолчанию представлены как строки, а типизировать их можно с помощью XML-схем. Но XML-схемы нужны не только для этого.
XML-схема позволяет описать структуру и правила, по которым должен быть устроен XML-документ:
- какие типы данных используются;
- какие поля обязательны, а какие нет;
- какие ограничения допустимы:
В контексте 1С XML-схема представлена объектом
У JSON тоже есть схема.
Но здесь есть довольно существенный минус, и он не в самой JSON Schema: в 1С нет встроенных инструментов для полноценной работы с ней во встроенном языке.
Да, мы можем написать интерфейс на другом, более JSON-нативном языке, и подключить его как внешнюю компоненту или публиковать как внутренний сервис. Но это уже не нативный инструмент.
➡️ Про конвертацию данных между форматами
На первый взгляд может показаться, что это довольно редкая задача.
Но на практике у неё просто своя интеграционная специфика.
Предположим, что наша система является участником одного общего бизнес-процесса, который проходит через три системы:
- первая система, выполнив свою часть работы, передаёт нам данные в формате JSON;
- мы в своей системе выполняем определённую задачу, а затем должны передать данные в третью систему, которая (упс, привет legacy), умеет работать только с XML;
- в этом случае задача конвертации из одного формата в другой ложится на нас.
Или другой пример:
- есть шина, в канал которой отправитель передаёт данные в формате JSON;
- 4 из 5 систем также принимают эти данные в JSON;
- а вот пятая система ожидает их уже в формате XML;
- в этом случае конвертация ляжет на шину.
С какими проблемами мы можем столкнуться при конвертации?
Для начала возьмём данные в формате XML и «в лоб» сконвертируем их в JSON:
Продолжение в комментариях⬇️ ⬇️ ⬇️
Это текстовая версия доклада из Жёлтого клуба. Кто пропустил: ссылки на материалы - тут.
Любая мало-мальски живая база - не изолированный остров.
Сайт с каталогом и заказами, 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👍5✍4❤1
Всем привет!
В предыдущем посте мы остановились на некоторой абстрактной, академической задаче:
Типовая конфигурация:
➡️ Сколько кода потребуется для решения такой задачи?
⬇️
А что, если я скажу, что хватит четырех?
"Это не честно!" - скажете вы.
"Конечно не честно" "есть нюанс" - скажу я 😅
Если воспроизвести этот алгоритм, и посмотреть на запись в XML, мы заметим - что мы описали не данные из сообщения JSON, а все сообщение целиком, включая структуру данных.
Этот пример приведен как один из вариантов решения подобных задач: мы использовали промежуточный DTO, который можно представить в обоих форматах.
Давайте подведем резюме:
▪️ XML и JSON используют разные модели представления данных
▪️ JSON допускает имена полей, невозможные в XML
▪️ В XML всё строка - нам нужно позаботится о сохранении типов данных при конвертации
▪️ Пространство имен, комментарии и прочая мета-информация требует отдельного представления в JSON
▪️ Неплохой вариант - использовать DTO для конвертации
▪️ Обратная совместимость накладывает существенные ограничения.
➡️ Теперь же посмотрим, какие методики и инструмента для работы с данными в этих форматах есть у нас во встроенном языке
Тут можно выделить 3 подхода:
▪️ Потоковый - читаем сообщение узел за узлом, не загружая его целиком в память. Хорошо для больших файлов. Минус: код сложнее и на каждой итерации нужно отслеживать контекст.
▪️ Объектный - например
▪️ Гибридный - сначала читаем потоком (например, до начала некоторого списка или массива), а когда дошли до объекта, читаем его через объектную модель. После его обработки читаемый следующий объект так же в объектной модели.
Кстати так работает типовой обмен БСП через универсальных формат
➡️ Производительность
▪️ Мне стало интересно, отличается ли производительность разных способов?
▪️ Есть ли вообще смысл ее считать?
Я взял пару простых сообщений в каждом из форматов:
Каждое из этих сообщений было прочитано разными способами:
▪️ С помощью
▪️
▪️
▪️
Было выполнено 1 000 000 итераций каждого сообщения каждым способом
Результат можно назвать интересным:
▪️ ФабрикаXDTO и потоковое чтение с помощью Прочитать() в цикле - 50 ~ 65 с.
▪️ ПрочитатьJSON() ~ 16 с.
▪️ ПрочитатьЗначениеJSON() ~ 12 с.
Казалось бы, существенная разница, не правда ли?
Но, напомню - это на 1 000 000 итераций. Если у вас что-то и тормозит в интеграциях - то скорее всего не тут.
Продолжение в комментариях⬇️ ⬇️ ⬇️
В предыдущем посте мы остановились на некоторой абстрактной, академической задаче:
Типовая конфигурация:
1С:ERPВходные данные — JSON.
Нужно:
- сконвертировать их в валидный XML;
- затем из полученного XML снова собрать JSON;
- ничего не потерять по дороге.
А что, если я скажу, что хватит четырех?
СоответствиеИзJSON = ОбщегоНазначения.JSONВЗначение(ИсходныйJSON, , Истина);
СтрокаВВидеXML = ОбщегоНазначения.ЗначениеВСтрокуXML(СоответствиеИзJSON);
СноваСоответствие = ОбщегоНазначения.ЗначениеИзСтрокиXML(СтрокаВВидеXML);
ТотЖеСамыйJSON = ОбщегоНазначения.ЗначениеВJSON(СноваСоответствие);
"Это не честно!" - скажете вы.
Если воспроизвести этот алгоритм, и посмотреть на запись в 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 итераций каждого сообщения каждым способом
Результат можно назвать интересным:
Казалось бы, существенная разница, не правда ли?
Но, напомню - это на 1 000 000 итераций. Если у вас что-то и тормозит в интеграциях - то скорее всего не тут.
Продолжение в комментариях
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤2🔥2
Forwarded from Павел Королев | IT Ланч
🔥 Андрей Соколов: «Как съесть 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 Ланч!
Как правильно работать с XML и JSON в 1С-интеграциях? Андрей Соколов (ведущий разработчик KORUS Consulting) разобрал оба формата с нуля — и это настоящая кладезь практики:
Всем, кто хотя бы раз мучился с парсингом XML или JSON в 1С. Особенно — тем, кто проектирует интеграции с внешними системами.
Ставьте лайки, комментируйте, делитесь с коллегами — и следите за каналом: скоро выложу и другие доклады с Жёлтого клуба!
#event@it_lunch
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍4❤1👏1
Всем привет! 🖐
⭐️ Сейчас много разговоров о новом механизме «Очередь», представленном в платформе 8.5.4.
Вендор позиционирует его так:
И тут сложились звёзды: я понял, что пора рассказать вам, что… очереди в ERP уже есть 😁
➡️ Реализованы они в составе механизма ОтложенныеЗадания.
В него входят как специализированные очереди:
▪️
▪️
так и УниверсальнаяОчередьОперативныхЗаданий.
Именно о ней поговорим подробнее.
➡️ Как это работает:
▪️ Бизнес-код решает, что задачу нужно выполнить отложенно.
▪️ Вызывается метод постановки задания в очередь.
▪️ Механизм добавляет строку в регистр очереди.
▪️ Позже обработка запускается:
➕ либо явно через
➕ либо регламентным заданием
▪️ Управляющий поток выбирает задания из регистра.
▪️ Задания группируются по аналитике и разбиваются на порции.
▪️ Для каждой порции определяется метод выполнения.
▪️ Порция выполняется в текущем сеансе, в управляющем потоке или в рабочих фоновых потоках.
▪️ Успешные записи удаляются из очереди, а ошибки остаются для повторной попытки или фиксируются как окончательные.
➡️ Пример можно посмотреть в
Там используется:
▪️
▪️ управляющий поток, в свою очередь, вызывает обработчик
➡️ Доработать механизм достаточно просто.
Например:
▪️ Откройте перечисление
▪️ Определите, где будет расположен метод обработки.
В общем случае обработчик лучше размещать там, где уже находится основная бизнес-логика процесса.
▪️ Реализуйте обработчик с сигнатурой:
▪️ Затем определите метод для нового задания.
В
▪️ После этого задание можно ставить в очередь:
Профит!👍
Более сложные кейсы, вплоть до реализации собственной очереди отложенных заданий с многопоточностью, приоритетами и интервалами выполнения - можно посмотреть в общем модуле
ℹ️ Важный нюанс: выполнение отложенного задания может быть назначено сеансу пользователя, отличного от инициатора задания.
Например, пользователь Иванов обработает счёт-фактуру, хотя задание было поставлено пользователем Петров, при проведении РТиУ.
На этом сегодня всё. До связи!✌️
Вендор позиционирует его так:
С помощью очередей можно оптимизировать, например, проведение документов, разделив его на действия, выполняемые синхронно в обработчике проведения, и действия, которые обязательно будут выполнены позже. Запрос на выполнение отложенных действий оформляется в виде сообщения очереди.
И тут сложились звёзды: я понял, что пора рассказать вам, что… очереди в ERP уже есть 😁
В него входят как специализированные очереди:
ЗаданияКРасчетуНормативногоГрафикаПроизводства;ЗаданияКОтражениюЛимитовПоДаннымБюджетирования;так и УниверсальнаяОчередьОперативныхЗаданий.
Именно о ней поговорим подробнее.
...Запустить(...);ВыполнениеОтложенныхЗаданий.УчетНДСРФ.ЗарегистрироватьЗаданияАктуализацииСчетаФактуры.Там используется:
УниверсальнаяОчередьОперативныхЗаданий.ДобавитьЗадание - добавляет задание в очередь и при необходимости инициирует запуск управляющего потока;УчетНДСРФ.ОбновлениеСчетовФактурВыданных.Например:
ЗаданияУниверсальнойОчереди и добавьте новый элемент, например МоеНовоеЗадание.В общем случае обработчик лучше размещать там, где уже находится основная бизнес-логика процесса.
Процедура ОбработатьМоеНовоеЗадание(
Задания,
ИдентификаторыНеОбработанныхЗаписей,
ДополнительныеСвойства = Неопределено) Экспорт
Для Каждого СтрокаЗадания Из Задания Цикл
Попытка
// Здесь основная бизнес-логика.
Исключение
ТекстОшибки = ОтложенныеЗадания.ТекстОшибкиВыполнения(
Новый Структура("Объект", Объект),
СтрокаЗадания,
ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ИдентификаторыНеОбработанныхЗаписей.Вставить(
СтрокаЗадания.ИдентификаторЗаписи,
ТекстОшибки);
КонецПопытки;
КонецЦикла;
КонецПроцедуры
В
УниверсальнаяОчередьОперативныхЗаданий.ОчередиЗаданий нужно добавить по аналогии:ДобавитьВложеннуюОчередь(
ТаблицаОчередей,
Перечисления.ЗаданияУниверсальнойОчереди.МоеНовоеЗадание,
"ИмяМодуля.ОбработатьМоеНовоеЗадание");
УниверсальнаяОчередьОперативныхЗаданий.ДобавитьЗадание(
СсылкаНаОбъект,
Перечисления.ЗаданияУниверсальнойОчереди.МоеНовоеЗадание);
Профит!
Более сложные кейсы, вплоть до реализации собственной очереди отложенных заданий с многопоточностью, приоритетами и интервалами выполнения - можно посмотреть в общем модуле
ОтложенныеЗадания.Например, пользователь Иванов обработает счёт-фактуру, хотя задание было поставлено пользователем Петров, при проведении РТиУ.
На этом сегодня всё. До связи!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12✍7👍7
Всем привет!👋
Сегодня мемо по дружбе обменов: когда одни не хотят, а другие не могут.
В большинстве случаев, при интеграции ERP ее нужно встроить в архитектурный зоопарк Заказчика, нередко включающий в себя legacy-системы.
Один из таких кейсов разберем сегодня.
Вводные данные:
Источник: УХ 1.4, EnterpriseData 1.3
Приёмник: внедряемая нами ERP 2.5, EnterpriseData 1.19
⭐️ Что сделали:
➡️ Сначала перенесли XDTO-пакет нужной версии EnterpriseData.
Дальше подтянули из более свежей версии УХ несколько модулей, связанных с универсальным форматом:
▪️ менеджер обмена через универсальный формат -
▪️ серверную логику обмена -
➡️ В логике отметки ключевых свойств правил конвертации добавили поддержку нового формата, чтобы для него использовалась перенесённая логика обмена.
Также пришлось точечно доработать типовой
если используется формат ED 1.19, выполнение уходит в адаптированную серверную логику обмена -
⭐️ Почему это понадобилось?
Например:
▪️ в XDTO-пакете появились свойства, реквизитов для которых в источнике просто нет, поэтому они выгружаются незаполненными;
▪️ в ED 1.3 свойства табличных частей были представлены как
▪️ изменились ключевые свойства в пакетах, поэтому для ED 1.19 нужно отдельно вызывать логику отметки ключевых свойств правил конвертации.
➡️ После этого пришлось почистить сам менеджер обмена.
▪️ Из правил обработки данных и правил конвертации объектов убрали объекты, которых не было в нашем релизе УХ.
▪️ Отдельно вырезали вызовы общих модулей из более свежей УХ, которых нет в УХ 1.4. Например:
▪️
▪️
▪️
▪️
➡️ В серверной логике обмена XDTO (
Не самый красивый путь, но вполне рабочий - особенно с учетом существенной экономии бюджета.
P. S. Кстати, этот кейс реализовали с Пашей.
Подпишитесь на него, если еще не подписаны.
А на этом сегодня все✌️
Сегодня мемо по дружбе обменов: когда одни не хотят, а другие не могут.
В большинстве случаев, при интеграции ERP ее нужно встроить в архитектурный зоопарк Заказчика, нередко включающий в себя legacy-системы.
Один из таких кейсов разберем сегодня.
Вводные данные:
Источник: УХ 1.4, EnterpriseData 1.3
Приёмник: внедряемая нами ERP 2.5, EnterpriseData 1.19
Дальше подтянули из более свежей версии УХ несколько модулей, связанных с универсальным форматом:
МенеджерОбменаЧерезУниверсальныйФормат13;ОбменДаннымиXDTOСервер.Также пришлось точечно доработать типовой
ОбменДаннымиXDTOСервер от версии УХ 1.4:если используется формат ED 1.19, выполнение уходит в адаптированную серверную логику обмена -
ОбменДаннымиXDTOСервер от свежей БСП.Например:
Структура, а в ED 1.19 — уже как таблица значений;УниверсальныйОбменЗагрузкаАналитикиРаботаСКурсамиВалютБПКлиентСерверТуристическийНалогСерверУчетКассовымМетодомОбменДаннымиXDTOСервер от свежей БСП) также убрали зависимости на механизмы из более свежей УХ: замеры, локализацию и вызовы стандартных подсистем (ОбщегоНазначения).Не самый красивый путь, но вполне рабочий - особенно с учетом существенной экономии бюджета.
P. S. Кстати, этот кейс реализовали с Пашей.
Подпишитесь на него, если еще не подписаны.
А на этом сегодня все
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Павел Королев | IT Ланч
Истории и заметки за 15+ лет в IT.
---
ТА Корус Консалтинг, Кунг-фу конфа, Ментор Solvery, 1С:Элемент в СПбПУ
---
ТА Корус Консалтинг, Кунг-фу конфа, Ментор Solvery, 1С:Элемент в СПбПУ
🔥9👍4❤2👏1