0. rozhkovdmitriy 23 15.09.15 13:10 Сейчас в теме

1С: 7.7. Функции-обертки, функторы, отложенный вызов, карринг параметров на примере функции чтения табличных данных

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

Перейти к публикации

Комментарии
Избранное Подписка Сортировка: Древо
1. MaxDavid 123 17.09.15 14:59 Сейчас в теме
К сожалению, некоторые разработчики на 1С и не только придерживаются в своей практике принципа простоты, считая что для создания хороших програм достаточно операторов Если...ИначеЕсли...Иначе...Тогда, Для..Цикл..КонецЦикла.
Простота обуславливает низкий порог вхождения и, как следствие, массовость, что для 1С актуальнее красоты и продуктивности кода.

Но подход интересный, на досуге посмотрю ))
21. alexey.kutya 202 19.02.19 11:22 Сейчас в теме
(1) Простота обуславливает низкий порог вхождения
и как следствие низкое качество кода
2. CheBurator 3403 17.09.15 23:08 Сейчас в теме
Приведите плиз не пример самих функций а пару кусков кода с использованием этих возможностей/функций для текущей работы
3. rozhkovdmitriy 23 18.09.15 09:12 Сейчас в теме
(2) CheBurator, добавил несколько примеров
4. vcv 86 18.09.15 13:00 Сейчас в теме
Подход интересный. Но боюсь, быстродействие будет сильно страдать.
Возврат глФильтрСпискаПоИ(лСостав
, глСписок("->", глСписок("СтажГазпромРКСПриУвольнении"), глСписок("больше", 14))
, глСписок("НеПереработал"));

Если уж пользуетесь активно функцией Шаблон, то почему бы не сделать более простой синтаксис?
Что-то типа такого:
глФильтрСпискаЗначений(лСписок,"($.СтажГазпромРКСПриУвольнении>14)И($.НеПереработал=1)")

где $ обозначает текущий объект перебираемой коллекции.
5. rozhkovdmitriy 23 18.09.15 14:33 Сейчас в теме
(4) vcv, Спасибо за интерес к теме

Подход интересный. Но боюсь, быстродействие будет  сильно страдать.


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

Если уж пользуетесь активно функцией Шаблон, то почему бы не сделать более простой синтаксис?
Что-то типа такого:

глФильтрСпискаЗначений(лСписок,"($.СтажГазпромРКСПриУвольнении>14)И($.НеПереработал=1)")


Я согласен с Вами, vcv, предложенный вид хорош и вполне себе реализуем для фильтра коллекции, но к сожалению не вписывается во всё разнообразие возможных вызовов.

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

Рождается больше вопросов чем ответов. Прошу меня поправить, если я во всем и не прав :)

глФильтрСпискаЗначений(лСписок,"($.СтажГазпромРКСПриУвольнении(прм1, прм2..., прмN)>14)И($.НеПереработал(прм1, прм2..., прмN)=1)")

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

Существующие реализации:

c++ (https://en.cppreference.com/w/cpp/utility/functional) ,
lisp (http://clojuredocs.org/clojure.core/sort)
javascript,actionscript - там нет явной подстановки операторов, зато лямбда-функции создаются на лету (http://javascript.ru/Function)

p.s. Были мысли перевести вызов функций на ВыполнитьФункцию объекта "Сервис" из FormEx, но что-то мне тогда помешало

Спасибо!
6. brr 177 18.09.15 14:59 Сейчас в теме
Вместо строки, с возможными опечатками, завести переменную, например, глСкопироватьСтажи = "глСкопироватьСтажи".

Вот и передача функции параметром.

Костыль конечно.
7. bulpi 157 18.09.15 22:02 Сейчас в теме
Как то Грибоедов написал "Горе от ума". Само произведение плевенькое, но название зачетное. Очень подходит для таких вот "произведений". Особенно доставляет поддержка таких вот конфигураций после ухода автора. Если бы проклятия обладали материальной силой, Вам, автор, пришлось бы очень плохо. Долго бы болели и умерли нехорошей смертью.
wolfsoft; +1 Ответить
8. vcv 86 19.09.15 12:41 Сейчас в теме
(7) bulpi, Проблема с поддержкой есть. Во многом она объясняется прямолинейностью мышления среднего 1Сника, не воспринимающего приёмов программирования, распространённых в других языках. Но проблему с поддержкой это не облегчает.
Мне больше не нравится проблема с проверкой кода. Синтаксический контроль в 7.7 и так прост и туп как доска, а тут у его еще и отбирают возможность проверить имя функции и количество параметров.
Я вот недавно занялся противоположным (в некоторой степени) вопросом. Как проверить еще что-нибудь в дополнение к синтаксическому контролю. Первый вариант прост и туп, но уже помог выловить ряд потенциально проблемных мест в большом рабочем проекте.
10. rozhkovdmitriy 23 21.09.15 06:25 Сейчас в теме
(8) vcv, добрый день, использую прототипирование в табло чтобы проверять работоспособность написанного, всегда "проваливаюсь" в функцию по ctrl-Enter чтобы посмотреть количество параметров.
15. wolfsoft 2420 23.09.15 09:12 Сейчас в теме
(8) vcv,
Во многом она объясняется прямолинейностью мышления среднего 1Сника, не воспринимающего приёмов программирования, распространённых в других языках.


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

PS: Особенно нравится одна самописная конфа - судя по коду, её явно писали люди, которые программировали до этого на фокспро, а тут заказчик потребовал написать конфу на 1с. 1с при этом они первый раз увидели, в результате чего нагромоздили такого, за что их периодически хочется побить. А самое грустное, что заказчик уже привык к такому и другого видеть не желает, поневоле приходится продолжать в том же духе.. ))
9. rozhkovdmitriy 23 21.09.15 06:20 Сейчас в теме
(7) bulpi, "горе от ума", вы правы, крыть нечем :)
11. kote 500 21.09.15 11:09 Сейчас в теме
Идея хорошая.
Но реализация - плохая..

И не то, что бы у Вас плохая - не знаю, можно ли удобнее сделать в 1С.. убогость языка, конечно, убивает. Особенно после того, как пощупаешь python или ruby - хочеться более гибкого языка.
autotrade; +1 Ответить
12. rozhkovdmitriy 23 22.09.15 07:49 Сейчас в теме
13. brr 177 22.09.15 10:39 Сейчас в теме
По конфигурации. Вроде как рекомендуется 1с++ грузить первой.
14. MaxDavid 123 22.09.15 20:31 Сейчас в теме
Впечатление двойственное, честно говоря. Можно, конечно, попытаться и Лисп реализовать на 1С, но... но...
Я сам одно время думал, как средствами 1С реализовать нечто похожее на мою юношескую любовь - Forth ))
16. wolfsoft 2420 23.09.15 09:14 Сейчас в теме
Ну, а так в целом, как разминка для ума, конечно, интересно :) В принципе, если функция работает и хорошо задокументирована, то почему бы и нет. Просто использовать её, не вникая в реализацию.
17. Frogger1971 23.09.15 09:44 Сейчас в теме
самое главное в публикации начинается после
- "продвинутый" код 1С 7.7
18. rozhkovdmitriy 23 23.09.15 14:29 Сейчас в теме
Спасибо за критику, друзья!

В оправдание своего решения позволю себе процитировать самого себя.

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


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

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


Если бы я был заказчиком, я бы тоже с осторожностью относился к *витиеватым* кусочкам кода соискателей. Ключевым словом, уважаемый woflsoft, является "витиеватые коды". Сам перелопатил, тонны такого кода, в зарплатной конфигурации, написанного тёмными силами, работающими в не менее тёмных застенках компании 1С и кода, написанного за счет моего предприятия, именитыми аутсорсинговыми компаниями-подрядчиками. Надеюсь вы не будете оппонировать отложенным вызовам и возьмете их на вооружение при сохранении требования отсутствия витиеватости.

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


Спасибо, так и есть, берем и пользуемся. Документация в шапках функций. Мои коллеги, их двое, не используют предложенные механизмы, но и по голове мне тоже не стучат, вполне себе могут править мои куски.
Более того, при обсуждении всплыл например такой вопрос - "Что проще, отложенные вызовы или прямые запросы из 1С++". И то и другое - инструмент. В первом случае надо иметь опыт работы с функторами на одном из ЯП высокого уровня, в другом - иметь опыт работы с SQL
19. aspirator23 407 26.09.15 14:34 Сейчас в теме
Поддержу автора. Мне такой подход ближе, чем километровые "портянки" из простых, а главное повторяющихся конструкций в коде. Которые да, легче поддерживать, но как то не вызывают чувства гармонии. Хотя, пожалуй, гармония мало подходит к коду. Но однотипные функции в разных местах - это уж точно не то чем стоит гордиться.
20. MaxDavid 123 26.09.15 19:56 Сейчас в теме
(19) aspirator23, видите ли, в чем дело. Фикси всегда доделывают конфу в соответствии со своими представлениями о красоте кода. Это нормально, их не в чем упрекнуть. Беда в том, что рано или поздно появляется человек, которому во всей этой красоте приходится разбираться. Даже топикстартер, при всем моем уважении и при всей его пунктуальности, допустил как минимум одну ошибку в документировании функций. Будь вы на месте руководителя, стали бы вы оплачивать приходящему 1Снику время, затраченное на вникание в красоту стороннего кода? ))
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству

Ведущий программист 1С
Омск
зарплата от 70 000 руб. до 110 000 руб.
Полный день

Программист 1С
Екатеринбург
зарплата до 120 000 руб.
Полный день

Консультант-аналитик 1С
Рязань
зарплата до 80 000 руб.
Полный день

Программист 1С
Рязань
зарплата от 90 000 руб.
Полный день