Три костыля. Сказ про фокусы в коде













Три интересных (или странных) костыля в коде, которые могут помочь в повседневных и не очень задачах.

О костыли!

Часто ли Вы делаете "костыли" в решении повседневных задач? Я да. И не стыжусь этого! Мы работаем на результат и главной нашей целью должно быть решение задач бизнеса. Иногда, не смотря на перфекционизм, разработчику приходится жертвовать качеством, порождать технический долг, но идти к поставленной цели.

Хорошего разработчика от плохого отличает не то, что его решения всегда идеальные с технической точки зрения. Самое ценное и важное качество — это доводить поставленную задачу до конца в разумные для бизнеса сроки, при этом не забывая о техническом долге и возвращаясь к нему в будущем. Не важно по какой причине было выбрано подобного рода решение. Важно, чтобы работа над улучшением продукта продолжалась, ведь вопросы архитектуры и качества технических решений актуальны всегда.

Сегодня, мы рассмотрим пару таких "костылей", которые могут быть Вам интересны. Добро пожаловать!

Итоги в динамическом списке

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

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

Результат — вот такое решение для итогов в динамическом списке управляемой формы:

  1. В форму списка добавляются реквизиты для хранения итогов и привязываются к подвалу соответствующих колонок списка.
  2. По событию "ПриПолученииДанныхНаСервере", "ПриАктивизацииСтроки" (о ужас!) или с помощью обработчика ожидания выполняем обновлением значений итогов с учетом отборов в динамическом списке.

Вся сложность заключается в том, что динамический список не получает сразу все записи, а получает их порциями. Соответственно, мы не можем сразу получить итог по всем документам по текущим данным списка, соответствующим отбору. Каким же образом его посчитать?

 

 Описание решения с итогами в динамическом списке

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

"Костыль" высшего уровня. Причем многим он и костылем не казался, а пользователи вообще были счастливы! Счастье длилось, пока в базе было немного документов, а пользователи не ставили сложных отборов в списке … ведь запросы для расчета итогов могут быть очень тяжелыми при большом количестве записей и особых отборах.

Никогда! Никогда не делайте итоги в динамическом списке! А если и делаете, то позаботьтесь, чтобы запрос для их расчета был простым во всех случаях.

Проверка наличия свойства

"Поле объекта не обнаружено" — все разработчики "мечтают" увидеть это сообщение от платформы! Особенно после развертывания релиза, применения новых доработок.

Однажды у клиента возникла проблема в интеграции, когда в функцию передавались объекты разных типов и для них выполнялись различные преобразования. В один прекрасный момент фоновые задания начали "вываливаться" с ошибкой "Поле объекта не обнаружено", нужно было срочное решение! Отладки на сервере нет, больше никакой информации об ошибке получить не удалось, клиент в стадии "всем конец".

Пришло "гениальное" решение — написать функцию, которая бы проверяла наличие поля или свойства у любого типа значения. Сказано — сделано!

Функция ПеременнаяСодержитСвойство(Переменная, ИмяСвойства)

// Инициализируем структуру для теста
// с ключом (значение переменной "ИмяСвойства")
// и значением произвольного GUID'а
GUIDПроверка = Новый УникальныйИдентификатор;
СтруктураПроверка = Новый Структура;
СтруктураПроверка.Вставить(ИмяСвойства, GUIDПроверка);

// Заполняем созданную структуру из переданного
// значения переменной
ЗаполнитьЗначенияСвойств(СтруктураПроверка, Переменная);

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

Если СтруктураПроверка[ИмяСвойства] = GUIDПроверка Тогда
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли;

КонецФункции

Пример использования функции ниже.

Процедура ПроверитьСвойствоДокумента()

РеквизитыДокумента = Метаданные.Документы.ТестовыйДокумент.Реквизиты;
ИмяРеквизита = "Комментарий";

Если ПеременнаяСодержитСвойство(РеквизитыДокумента, ИмяРеквизита) Тогда
Сообщить("Реквизит """ + ИмяРеквизита + """ найден!");
Иначе
Сообщить("Реквизит """ + ИмяРеквизита + """ НЕ найден!");
КонецЕсли;

КонецПроцедуры

В тестовой конфигурации, исходный код которой Вы можете найти на GitHub, результатом будет сообщение:

>> Реквизит "Комментарий" найден!

Все взлетело!

В итоге проверку в алгоритмы обмена добавили, и проблема решилась. Спустя неделю добрались до истины — проблема была в плохих данных. Но "костыль" работает до сих пор.

Думаете, что это все? Нет! Эта функция переехала в общий модуль и со временем ее начали использовать другие разработчики! Не важно, позволяет ли платформа проверять наличие свойства для типа или нет, проще использовать универсальную функцию и не беспокоиться!

Сейчас это решение используют до сих пор. "Костыль" стал удобным решением, позволяющим обходить некоторые ограничения платформы. Минусы у этого подхода очевидные:

  • Игнорирование стандартного функционала платформы 1С усложняет сопровождение.
  • Снижение производительности по сравнению со стандартными методами. На сколько происходит замедление зависит от конкретной ситуации.

А Вы используете такую "костылефичу"?

Чтение наборов записей запросом

На одном из проектов по оптимизации производительности также пришлось использовать одно сомнительное решение. Всем известно, что при выполнении конструкции "НаборЗаписей.Прочитать()" в транзакции, платформа 1С устанавливает разделяемую управляемую блокировку на прочитанные данные до конца транзакции. Этот момент отлично описан в статье "Ускорение в 100 раз. Решаем проблему блокировок" от Андрея Бурмистрова. Почему это может быть плохо? При параллельной работе пользователей это может привести к управляемым взаимоблокировкам. Опять же, посмотрите статью.

Решение этой проблемы обычно простое — нужно отказаться от использования объектной техники работы с данными там, где они нужны только для чтения. Лучше всего использовать запросы. Если же нужно использовать такой способ работы, то перед вызовом "Прочитать()" необходимо установить исключительную управляемую блокировку. 

Но что, если исправлять нужно сотни таких мест в конфигурации, а то и больше. Что если в некотором отраслевом решении (чисто гипотетически) объектную технику при работе с наборами данных регистров используют повсеместно. И правильно! Зачем эти запросы, так же проще!

Как Вы догадались, времени на исправление всех мест просто не было и было найдено быстрое решение — чтение набора записей с помощью запроса.

 

 Что там за реализация

Фактически, мы получаем данные запросов и на их основе заполняем набор записей. Как это использовать? Например, стандартный способ работы с набором записей такой.

НаборДвиженияНоменклатураНоменклатура = РегистрыНакопления.ДвиженияНоменклатураНоменклатура.СоздатьНаборЗаписей();
// "Документ" - ссылка на документ регистратор
НаборДвиженияНоменклатураНоменклатура.Отбор.Регистратор.Установить(Документ);
НаборДвиженияНоменклатураНоменклатура.Прочитать();

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

НаборДвиженияНоменклатураНоменклатура = РегистрыНакопления.ДвиженияНоменклатураНоменклатура.СоздатьНаборЗаписей();
// "Документ" - ссылка на документ регистратор
НаборДвиженияНоменклатураНоменклатура.Отбор.Регистратор.Установить(Документ);
// Вместо вызова метода "Прочитать()" используем собственную процедуру
ПрочитатьНаборРегистраЗапросом(НаборДвиженияНоменклатураНоменклатура);

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

Такой "костыль" помог исправить проблемы производительности и возникающие взаимоблокировки, но не решил множество других связанных проблем…

Костыли в оптимизации! Кто бы мог подумать!

Мы человеки!

Считаете, что всегда нужно делать идеальные решения? Качество важнее сроков? Процесс важнее результата?

Мы все ошибаемся, делаем спорные решения и можем сомневаться в их правильности. Уж про себя все это я могу с уверенностью подтвердить.

Будем честными к себе и окружающим.

Если и у Вас есть истории о "костылях" и готовность ими поделиться — добро пожаловать в комментарии!

Какой самый "лучший костыль" был у тебя!?

Другие ссылки

69 Comments

  1. nvv1970

    Костыли, если они есть, должны быть тоже качественные. Например, выноситься в функции, в общие модули и т.п. Если так будет — то все норм.

    Основная беда — именно структуризация кода. Именно она позволяет делать быстрые и удобные модификации и откаты.

    ПС: недавно видел процедуру на несколько тысяч строк. И это в решении, которое висит на releases.1c. А количество повторов кусков кода — десятки. Совместимо, чё ((

    Reply
  2. YPermitin

    (1) костыли, косиыли они повсюду)

    Reply
  3. mvk4d

    (0), так проверка наличия свойства или реквизита есть в БСП в базовой функциональности.

    ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Объект, ИмяРеквизита)

    Функция ЕстьРеквизитИлиСвойствоОбъекта(Объект, ИмяРеквизита) Экспорт

    КлючУникальности = Новый УникальныйИдентификатор;

    СтруктураРеквизита = Новый Структура(ИмяРеквизита, КлючУникальности);

    ЗаполнитьЗначенияСвойств(СтруктураРеквизита, Объект);

    Возврат СтруктураРеквизита[ИмяРеквизита] <> КлючУникальности;

    КонецФункции

    Reply
  4. YPermitin

    (3) во времена, когда этот костыль появился — такого еще не было в БСП. В старом блоге писал о нем еще в 2013 году.

    Потом это появилось БСП. Это настоящий вирусный костыль!

    Reply
  5. json

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

    Reply
  6. YPermitin

    (5) ага, или «быстрое решение», «некоторая реализация», «прототип» или просто «нестандартный подход». 🙂

    Reply
  7. brr

    (6)эвфемизмы, они повсюду 🙂

    Reply
  8. alex-l19041

    мне кажется что для вида сравнения Содержит

    надо добавить «%» перед и после ЭлОтбора.Имя

    Reply
  9. YPermitin

    (8) вероятно. Или же это было сделано в «костыле» намеренно.

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

    Reply
  10. Kutuzov

    Не полностью по теме, но тоже описал несколько найденных «фишек»

    Неожиданности при работе с УТ 11 и платформой

    Reply
  11. YPermitin

    (10) плюсы доставлены!

    Reply
  12. imh9305

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

    Reply
  13. Артано

    (1) Золотые слова. По этому поводу я всегда говорю «хорошо структурированный говнокод намного лучше, чем бессвязный набор идеальных алгоритмов». Можно брать вмемориз при условии сохранения копирайта =)

    Reply
  14. Evil Beaver

    (6) ну и для ачивки «мозго*б 80 уровня» — применяем термин «ад-хок солюшен»

    Reply
  15. YPermitin

    (14) запомнил на случай важных переговоров 🙂

    Reply
  16. fredly_nightly

    (3) тот же костыль, только в БСП))

    Reply
  17. Rustig

    (0) а что за комплексы у вас?- называете программирование «костылями», боитесь использовать ПриАктивизацииСтроки() («о, ужас!»)

    Reply
  18. YPermitin

    (17) о комплексах не говорят вслух! 🙂

    Reply
  19. fredly_nightly

    (5)

    годно заменять на синоним «

    баги порождают костыли

    особенности платформы позволяют воспользоваться нетипичными решениями

    Reply
  20. Infector

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

    Reply
  21. YPermitin

    (20) благодарю.

    Но чувство, что я накостылил в прошлом все равно со мной.

    Reply
  22. Synoecium

    (6) еще вариант «острая производственная необходимость» 🙂

    Reply
  23. Maxisussr

    (0)

    Да, согласен с тем, что код на 1С писать так уж и трудно, но более ценное качество это умение за ограниченный срок и бюджет на изначально кривом решении решить поставленную задачу, ничего сильно сразу не поломав и чтобы потом оно работало. И отлично, что у автора есть чувство «что накостылил». Это позволяет двигаться вперед! Все мы иногда «костылим», что уж там!

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

    Reply
  24. sergathome

    Мой самый позорный костыль был в одном отраслевом решении. Архитектор никак не мог грамотно сформулировать, как будут работать отборы в одной ну очень сложной форме. Пришлось вместо компоновки одного общего запроса, возвращающего сразу готовый набор, организовать несколько циклических переборов… Зато в эти переборы можно было быстро вносить новые хотелки.

    Reply
  25. fixin

    Люблю костыли.

    Знаю, умею, применяю.

    Reply
  26. sergathome

    (23) с БСП, увы, не всё так однозначно. Культура разработки БСП далека от идеала. Часто надёжнее написать своё, чем использовать весьма сомнительное готовое — меньше гимора при поддержке 😉

    Reply
  27. YPermitin

    (25) коллега!

    Reply
  28. VmvLer

    ретрограды!

    костыли уже не модно.

    я использую в коде экзоскелеты.

    Reply
  29. VmvLer

    (26) методы в секциях ПрограммныйИнтерфейс вроде заслуживают доверия как 2*2 = 4

    методы БСП из остальных секций необходимо использовать осторожнее.

    Reply
  30. zqzq

    Костыль «Итоги в динамическом списке» уже (большей частью) встроили в платформу: https://wonderland.v8.1c.ru/blog/poluchenie-dannykh-dinamicheskogo-spiska/?sphrase_id=108208

    Reply
  31. bulpi

    Статья понравилась, плюс поставил. Но ужасно не понравилась реализация первого костыля. Автор тут же ссылается на других авторов, у которых костыль красивее, современнее и легче!

    Reply
  32. YPermitin

    (31) мне он и самому не нравится. Это был 2013 год, я выживал как мог 🙂

    Сейчас бы я все сделал по другому. И другие статьи я привел как-раз для контраста.

    Reply
  33. Maxisussr

    (23)

    Не могу спорить на счет каких-то специфических функций, просто нужно знать, что есть готовые простые функции, которые нормально работают. А вот поиск функций в БСП — часто проблема, что-то просто запоминаешь, но если тебе нужно найти какую-то вроде простую ф-ю, порой это очень непросто сделать.

    (30)

    Верно, методы не из «интерфейса», строго говоря, запрещено использовать.

    Reply
  34. sergathome

    (33)

    А вот поиск функций в БСП — часто проблема

    И это тоже. Ещё момент — если видишь «велосипед» у кого-то, то совсем не факт, что это он его повторно изобрёл, а не в БСП наконец включили аналог :)) как у автора, кстати

    Reply
  35. Rustig

    (29) как раз вот тут использовано https://infostart.ru/public/837694/

    Reply
  36. Sergey.Noskov

    Поддерживаю вброс)) Увидел пересечение с парой тем своего доклада в 2017м году.

    Заказчику требуется работающее решение, а не идеальное.
    Reply
  37. YPermitin

    (36) а можно ссылочки на доклады для прочмотра?) Воспользуюсь случаем и попрошу, чтобы посмотреть потом 🙂

    Reply
  38. ybatiaev

    Не из мира 1С. Как то бухгалтерия, в 1992 году, используя ДОСовую программу, захотела печатать сложные отчёты в MS Word. Задача решена была следующим образом:

    1. ДОСовая программа собирала нужные данные и выкладывала в определённую папку с набором данных для каждого отчёта;

    2. Были написаны несколько макросов(по количеству отчётов) в MS WORD;

    2. На DELPHI была написана прога, висевшая в трее, которая «слушала» этот каталог, если что ))) — запускала WORD с нужным макросом;

    В итоге все довольны. Проработал сей костыль исправно до покупки 1С.Бухгалтерия пару лет.

    Прям сейчас — задание написать простой для пользователей-администраторов баз и файлов «архиватор-администратор-обновлятор» с максимальными данными на главной форме для оперативного принятия решений с минимальным количеством кликов. Вот уж пришлось костылей нагородить от души )))) Ни одна существующая прога им не подошла. Просили попроще и чтобы всё было максимально автоматизировано(больше интеллекта). Написал КАК ХОТЕЛИ пользователи ))))

    Reply
  39. Sergey.Noskov

    (37) есть в виде статьи 🙂

    https://infostart.ru/public/835719/

    Reply
  40. YPermitin

    (39) благодарствую!

    Reply
  41. YPermitin

    (38) аплодисменты!

    Reply
  42. alex_bitti

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

    Reply
  43. Aggressorak

    (23) БСП у 1С в состоянии вечной бэты, если не альфы. Ей пользоваться ваобще страшно. По хорошему надо в свои общие модули копипастить код из БСП чтобы случайно не удалили полностью в очередной версии или не изменили до неработоспособности.

    Reply
  44. ogoneksergei

    (29)Таким способом делал итоги в ДС. Очень быстро и ном отрабатывает.

    Reply
  45. korelski

    на сайте 1С есть статья о том как костыли к динамическому списку превращаются в реанимационную каталку

    «5.3.1. Временные таблицы в динамических списках рекомендуется использовать только тогда, когда они содержат заведомо небольшое количество записей. Иначе их использование неэффективно, т.к. значения временных таблиц в динамическом списке НЕ кешируются, а формируется при каждом считывании данных для заполнения списка.»

    Reply
  46. Fox-trot

    (38) делал примерно тож самое в бородатом… не помню каком году

    из доса печатали в файлы, а другая прога отправляла все на новехонький лазерный притер

    а вот чем все закончилось не знаю. может до сих пор пользуют ))

    такие дела

    Reply
  47. YPermitin

    (45)

    на сайте 1С есть статья о том как костыли к динамическому списку превращаются в реанимационную каталку

    В некоторых случаях это может быть спасением. Но не костыль ли это? 🙂

    Reply
  48. script

    Я боюсь даже представить что случится, если в 1С добавят полноценное ООП. Костыли станут многомерными — это будет круче обфускации кода.

    Reply
  49. MikhailDr

    В свое время так и не смог донести до руководства, что итоги в динамическом списке это хрень и их надо смотреть в отчете.

    Reply
  50. YPermitin

    (49) у меня это вообще ни разу не получалось, когда такой вопрос вставал.

    Красноречие недостаточно прокачано 🙂

    Reply
  51. МимохожийОднако

    (50) В подобных случаях я использую фразу:»Я Вас пЕредупредил!» и клепаю, как заказали. В случае последующего запроса отвечаю:» Я Вас пЕредупреждал» и переделываю как надо за дополнительный гонорар. Доступно и всерьёз )

    Reply
  52. YPermitin

    (51) а неплохо!!!

    Reply
  53. MikhailDr

    (51) вариант для фриланса, но не для фикса

    Reply
  54. Liogon

    Сам не делал, но поддерживал.

    Компания с территориально удалёнными розничными точками. Нетиповая конфигурация на обычном приложении. При открытии очередного магазина обнаружилось, что чек на ккм Печатается неприемлемо долго. На исправление ситуации была ночь до открытия. В итоге: толстый клиент запускается в сервисе терминалов. При необходимости печати чека, нужные данные формируются в текстовый файл, который кладётся в специальную папку на клиентской машине. На клиентской машине запускается самописная конфигурация, которая умеет работать с ккм. Она периодически смотрит папку на наличие файла, и если находит, запускает процедуру печати. Данные файла сохраняет в себя, сам файл после этого удаляется.

    Это уже костылил сам

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

    Reply
  55. МимохожийОднако

    (53) и для франча.

    Reply
  56. Yashazz

    (1) Я видел совершенно чудовищные фрагменты кода и в типовых конфигурациях. То есть ужасающие и уродливые. Дублирующие друг друга или работающие едва на треть. Адски нерациональные по производительности, немасштабируемые итд. Чо, нормуль, стандарты такие стандарты…

    Reply
  57. Yashazz

    (25) Клиент попросил распечатки яндекс-карт, успешно работавших в системе, для курьеров, с точкой на карте. И тут выяснилось, что на тот момент API 2.Х яндекса не умеет это делать, от слова ваще. А умеет только 1.1, и то кривовато, они аж конференцию на эту тему делали. Что изобрёл: карта помещалась на отдельную форму (были только обычные формы), форма раскрывалась в режиме рабочего стола на весь экран, заслоняя ваще всё, с неё делался скриншот, картинка скриншота уходила курьеру на мыло. Форма сразу закрывалась. Один из самых моих жутких костылей)

    А изложенное тут — ну, кое-что платформа уже научилась делать, но так очень многое можно счесть костылями. Сколько ухищрений я делал ради оптимизации запросов динамических списков, которые не понимали составные запросы и временные таблицы — да полно. Сколько чисто архитектурных решений родилось, потому что иначе платформа не позволяла… Пока функций СКД и вызова общих модулей не было… Пока управляемые формы развивались… Да любой наверняка выкручивался как мог. Сейчас это кажется постыдными костылями, но тогда ведь помогло решить задачу, и не всегда было непроизводительным… Чего стыдиться-то? Некоторые вещи в рамках одного события УФ нельзя сделать, приходится запускать одноразовую обработку ожидания на 0.1 секунды, это, к примеру, костыль?)

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

    Reply
  58. Артано

    (53) Для фикса тоже годится как средство экономии нервов в споре с заказчиком. Или предупреждаешь или договариваешься выделить время на преобразование костыля в нормальное решение, если доработка будет использоваться.

    Reply
  59. lmnlmn

    Сейчас работаю с УПП доработанным под нужды предприятия. Надо сделать АРМы которые агрегируют данные чуть ли не по принципу OLAP так чтоб это было актуально, оперативно, да еще и редактировать можно с сохранением обратно в базу. Так что с ноября прошлого года я генератор костылей. Про парочку уже рассказывал. Возможно что некоторыми поделюсь позже.

    Один из последних костылей это «квазиасинхронная» свертка/развертка до нужного уровня дерева значений на управляемой форме без блокирования работы пользователя и выводом индикатора прогресса))

    Reply
  60. YPermitin

    (59) статьи интересные.

    Возможно, это даже не костыли, а реальная производственная необходимость.

    Reply
  61. AllexSoft

    Итоги в динамическом списке то же делал, точно так же пользователи хотят, хоть что делай. В итоге сделал итоги которые работали только по отдельной кнопке «Показать итоги в списке», для большинства пользователей она не нужна была и те работали с привычным дин. списком, а те кто пользовал итоги нажимали кнопку, появлялся подвал с итогами (у них разумеется медленнее работало).

    Костыль из необычного если так можно назвать делал такой:

    Задача сделать справочник цветов (в RGB), он по большей части статический (pantone можете посмотреть что такое), но цветов там прям много, порядка 10тыс! Самое главное что в форме выбора в динамическом списке должна была показываться колонка с визуальным отображением этого цвета (реального цвета). В итоге решил через библиотеку картинок, сделал обработку которая по заполненному справочнику цветов, брала RGB каждого цвета, рисовала картинку 16х16, далее следующий элемент, опять картинку 16х16, далее склеивала эти тысячи картинок в одну огромную картинку 16хNNNNNNN, индекс картинки соответствовал коду элемента справочника цветов, далее картинка загружалась в библиотеку картинок, в форме выбора вывести картинку по индексу — штатный механизм.

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

    Reply
  62. tmn72.1C

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

    Reply
  63. ignor
    Reply
  64. Rustig

    (43) можно заглушку написать:

    Если ВерсияБСП() = «….» Тогда
    //используем процедуры БСП
    Иначе
    //используем свой алгоритм
    КонецЕсли;
    Reply
  65. Aggressorak

    (64) Да как угодно, только не отдавать все карты в руки разрабам.

    Reply
  66. ogidni

    Я то думал «я программист» — а оказывается 15 лет костыли вытачиваю в токарном конфигураторе

    Reply
  67. Perfolenta

    (38) да, в досовские времена мне многое приходилось делать через слежение за папкой… тогда стандартных интерфейсов и технологий взаимодействия между программами почти не было…

    Reply
  68. Cyberhawk
    // Если значение для свойства структуры осталось

    // NULL

    Видимо, ранее в структуре-зонде использовался НУЛЛ, но затем он был заменен на УИД.

    Reply
  69. Glebis
    При этом никаких блокировок в транзакции платформа не установит, ведь все записи прочитаны запросом

    Тогда вообще можно не вклинивать в транзакцию запрос, прочитав набор для движения в процедуре «ПередЗаписью» (проверив что РежимЗаписи = Проведение) и сохранив его в дополнительные свойства Объекта.

    Reply

Leave a Comment

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