Имя: Пароль:
1C
1С v8
Ваши любимые костыли в конфигурациях 1С
, , ,
0 hi1C
 
09.12.19
09:35
Добрый день коллеги! Не секрет, что костыли исправляющие поведение платформы проникли даже в БСП, см. ОбщегоНазначения.ЗначенияРеквизитовОбъекта. Поделитесь своими "любимыми" костылями.
196 dmpl
 
09.12.19
14:24
(194) Это так и было задумано :) Он поэтому и не ГУИД.
197 hi1C
 
09.12.19
14:33
(196) 1С ввела в заблуждение названием, надо было назвать ИногдаУникальныйИдентификатор
198 ДенисЧ
 
09.12.19
14:34
(197) Не иди по стопам 1с, не вводи в заблуждение окружающих.
Он уникальный. В пределах таблицы.
199 hi1C
 
09.12.19
14:39
(198) ок, УникальныйИдентификаторВПределахТаблицы
200 Cyberhawk
 
09.12.19
14:42
(185) Скинь мне тоже пож-та (или в Телегу)
201 Злопчинский
 
09.12.19
14:43
одно время состав бухии менялся резвенько, и в торговой базе все время менялись бухи. причем у каждого нового - свой уникальный набор разрешений. достало. дал админские права в базе и все.
202 hi1C
 
09.12.19
14:44
Коллеги не стесняйтесь, делитесь любимыми костылями.
203 Cyberhawk
 
09.12.19
14:46
(202) Обертка для менеджера записи со свойствами как у набора записей (обменданными.загрузка и доп. свойства)
204 hi1C
 
09.12.19
14:48
(203) это круть :)
205 hi1C
 
09.12.19
14:48
(203) не могу представить зачем это
206 Cyberhawk
 
09.12.19
14:49
(205) Наглядность и краткость кода (как у МЗ) с использованием указанных выше двух возможностей, доступными только НЗ
207 Cyberhawk
 
09.12.19
14:49
*доступных
208 hi1C
 
09.12.19
14:50
(201) Права...  сколько я повидал РС с названиями типа "Доп.права", "Динамические права" и т.д. с разным радиусом кривизны реализации.
209 hi1C
 
09.12.19
14:51
(206) ясно, я так привык к НЗ, глаз уже замылился, лет 5 наверное РЗ не использую
210 hi1C
 
09.12.19
14:51
(209) очепятка РЗ = МЗ
211 hi1C
 
09.12.19
14:53
а собственные индексы, привет соглашению с 1С, кто нибудь использует?
212 Конструктор1С
 
09.12.19
14:53
(154) и что, что на жаве?
213 Конструктор1С
 
09.12.19
14:54
(138) на жаве говнокодить можно, но делать это чуть сложнее, чем на 1с
214 ДенисЧ
 
09.12.19
14:54
(212) "язык должен быть серьёзным, без лишних волностей"
(с) Не Я
215 hi1C
 
09.12.19
14:57
продолжу, флюент интерфейс через обработки, см. инфостарт
216 Конструктор1С
 
09.12.19
15:06
(140) ИМХО, дело не в нише, переваривающей говнокод. Платформа 1с это уже сам по себе некий стандарт. Ни один рукожом не сможет заставить справочник перестать быть справочником. Притащи с улицы любого 1сника, ткни пальцем в любой объект в дереве объектов конфигуратора, и этому 1снику будет понятно предопределенное поведение этого объекта, для чего и как он может быть использован. В то же время, на том же FoxPro городили кто во что горазд. Наверно поэтому FoxPro так и не доросла до серьёзных систем, застряв на уровне наколенных нетленок. Фузинцы решили повторить подвиги FoxPro, во что это вылилось сам видел: у них справочник это недосправочник-недоотчет-недорегистр в одном гранёном стакане. В то же самое время, на 1с такое нарукожопить сложно. Вот поэтому 1с и держится прочно в своей нише - у платформы большой запас прочности
217 novichok79
 
09.12.19
15:53
(86) (87) используется в фоновых заданиях, разумеется в основном потоке я не использую эту функцию.
218 hi1C
 
09.12.19
16:13
Замечательный костыль в БСП: ПроверитьПараметр.

Синтаксис

Процедура ПроверитьПараметр(Знач ИмяПроцедурыИлиФункции, Знач ИмяПараметра, Знач ЗначениеПараметра,
    Знач ОжидаемыеТипы, Знач ОжидаемыеТипыСвойств = Неопределено) Экспорт
Параметры

   ИмяПроцедурыИлиФункции - Строка - имя процедуры или функции, параметр которой проверяется.
   ИмяПараметра - Строка - имя проверяемого параметра процедуры или функции.
   ЗначениеПараметра - Произвольный - фактическое значение параметра.
   ОжидаемыеТипы - ОписаниеТипов, Тип, Массив, ФиксированныйМассив, Соответствие, ФиксированноеСоответствие - тип(ы)
       параметра процедуры или функции.
   ОжидаемыеТипыСвойств - Структура - если ожидаемый тип - структура, то
       в этом параметре можно указать типы ее свойств.

У меня не типовая, с БСП близко не знаком.
219 hi1C
 
09.12.19
16:31
в БСП, как в Греции, всё есть

ЭтоУникальныйИдентификатор
Проверяет, является ли строка уникальным идентификатором.
В качестве уникального идентификатора предполагается строка вида
"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", где X = [0..9,a..f].
Синтаксис

Функция ЭтоУникальныйИдентификатор(Знач Значение) Экспорт
Параметры

  Значение - Строка - проверяемая строка.
Возвращаемое значение

  Булево - Истина, если переданная строка является уникальным идентификатором.
220 fisher
 
09.12.19
16:33
(218) С принципе, мне нравится твоя философия. "Язык + костыли = программа". Как-то так оно в жизни и происходит.
221 hi1C
 
09.12.19
16:47
(220) Костыли неотъемлемая часть программы, невозможно всё впихнуть в язык. Но когда использование костыля становится массовым, мне кажется, что пора задумываться о включении его в язык. Если посмотреть синтакс-помощник можно найти методы которые не понятно кому нужны. Но они есть, а то что используется во всех типовых почему то в язык не включено. Где логика?
222 palsergeich
 
09.12.19
16:59
(221) логика в том что развитие языка идёт по плану.
Сначала появляются библиотеки, потом они становятся частью языка. Как это было например со строковыми функциями например
223 Конструктор1С
 
09.12.19
17:05
(218)(219) не понятно, почему ты подобные библиотечные функции считаешь костылями? Например, ЭтоУникальныйИдентификатор() очень полезная функция при интеграции со сторонними системами
224 hi1C
 
09.12.19
17:14
(223) Костыль, в данном случае, то что могло быть в платформе. Но этого нет. Если бы это было разово разработано, каким то левым разработчиком, для узкой цели, то бог с ним. Но это применяется массово. Вот я не использую, БСП, сам виноват - знаю, мне нужно или самому писать что-то такое, либо искать написанной другими. Я и написал, через попытку.
225 fisher
 
09.12.19
17:41
(221) Частично так и происходит. Какие-то функции, ставшие стандартными в БСП, были впоследствии реализованы в языке. Вспомнить хотя бы ЗначениеЗаполнено, СтрШаблон и т.п. Но это касалось только очень простых и действительно очень массово и постоянно используемых функций.
(244) Вопрос в том, стоит ли в стандартную библиотеку языка тащить все полезные функции? Однозначно нет. Вот ты говоришь, что проверка на уникальный идентификатор применяется массово. Вопрос в том - насколько массово? Я вот лично ни разу не проверял. И почему-то мне кажется, что я не одинок. Тоже самое ПолучитьРеквизиты() - применяю чрезвычайно редко. Обычно удается писать так, чтобы получать все запросами одновременно с кучей других данных. А в простых и понятных случаях - смело работаю через точку.
А вот ЗначениеЗаполнено() и СтрШаблон() - другое дело. Это нужно всем и каждому и нужно постоянно.
226 fisher
 
09.12.19
17:45
Я могу понять, когда в платформу добавляют нечто, что не используется массово, но что сложно или неудобно реализовать на языке 1С, если это вдруг понадобится. Тут есть резон. А какой смысл включать в язык что-то, что массы каждый день не юзают, но что легко реализуется при необходимости и так?
227 hi1C
 
09.12.19
17:54
(226) ЗначениеЗаполнено так же легко реализуется
228 fisher
 
09.12.19
18:36
(227) Зато оно пригождается в каждой второй функции, кто бы и что бы не писал.
229 Fragster
 
гуру
09.12.19
18:51
Недавно такое в УТ видел:

Функция ВремяОжиданияИтерации(НомерИтерации)
  
    Если НомерИтерации < 15 Тогда
        ВремяОжидания = 1;
        Для НомерИтерации = 2 По НомерИтерации Цикл
            ВремяОжидания = ВремяОжидания * 1.4;
        КонецЦикла;
    Иначе
        ВремяОжидания = 120;
    КонецЕсли;
  
    Возврат ВремяОжидания;
  
КонецФункции

вроде переписали по человечески
230 Fragster
 
гуру
09.12.19
18:52
интересно здесь вот это:
Для НомерИтерации = 2 По НомерИтерации Цикл
(ну, кроме того, что все это в принципе говнокод)
231 DTX 4th
 
09.12.19
18:59
Да, нет смысла тянуть ТЧ при обращении к реквизиту ссылки

(39) О, я себе недавно такое писал)

(54) Ага, давайте лучше размажем простецкую конструкцию на 5 строк...

(57) Достаточно просто не получать табличные части у ссылок.. Так извращаться ради реквизитов - оверхед

Где голосовалка?

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

Где ++?
Где лямба функции?
LINQ бы не помешал

С переходом на 8.3 могли бы добавить методы, которые конвертят ТЗ в массивы и наоборот.

Но нет, верх всего происходящего - это долгожданное появление таких функций как СтрШаблон.
Нет слов.
232 DTX 4th
 
09.12.19
19:01
(230) Почему говнокод?
233 Fragster
 
гуру
09.12.19
19:05
(232) потому что этот код не работает (всегда одна итерация цикла), а также потому что возведение в степень есть в платформе.
234 Fragster
 
гуру
09.12.19
19:07
но знали ли вы, что предел цикла Для вычисляется один раз? и при этом после присвоения начального значения?
235 DTX 4th
 
09.12.19
19:22
(233) Если заменить переменную счетчика на другую, то имеет право на жизнь.
По (230) я подумал, что сама идея - говнокод.
236 Конструктор1С
 
09.12.19
19:38
(231) "С переходом на 8.3 могли бы добавить методы, которые конвертят ТЗ в массивы и наоборот"

Так это же есть в БСП. К тому же не самая распространенная задача. В большинстве случаев не требуется гнать никакую табличку на клиент
237 Конструктор1С
 
09.12.19
19:40
ООП - сомнительная необходимость в 1с. Сколько я ни спрашивал у апологетов ООП, никто так и не сумел привести примера надобности оной в 1с
238 DTX 4th
 
09.12.19
22:45
(236) В большинстве случаев и регистры расчета не нужны. Давайте их в БСП вынесем

(237) Достаточно будет инкапсуляции (да, я только что гуглил основные принципы). В наследовании основного смысла нет, ну а про инкапсуляции вы и сами понял xd

Пример:
Хочу сделать объект, который будет обрабатывать мою таблицу значений. Первый метод - возвращает сортированную, второй - конвертит в массив, и т.д.

Текущие варианты реализации:
1. На ОФ можно сделать модули в виде форм. Как тиражное решение - никуда не годится. Крайне неудобно
2. На УФ? Ну на клиенте можно те же формы. А сервер?

Инициализировать всё нужное в структуру, а потом гонять её по функциям, которые будут разбросаны вперемешку с основным кодом?
https://i.ytimg.com/vi/HcfHBgUTn7I/maxresdefault.jpg
239 DTX 4th
 
10.12.19
01:29
(238) "про инкапсуляции вы и сами понял" -> "про полиморфизм вы и сами поняли"
240 Конструктор1С
 
10.12.19
04:25
(238) инкапсуляция это не какие-то там возможности программирования. Это прежде всего принципы написания кода. Инкапсуляция была придумана ещё задолго до ООП, только пользовались ей лишь опытные разработчики, и держалась она на дисциплине при написании кода. В 1с есть всё необходимое, чтобы инкапсулировать алгоритмы. Ты можешь создать общий модуль, добавить в него экспортную процедуру, вспомагательные процедуры сделать не экспортными, и будет твой алгоритм инкапсулирован в самом полном смысле этого слова. А полиморфизм при динамической типизации, как мы уже выяснили, скорее источник проблем, чем благо
241 ДенисЧ
 
10.12.19
06:13
(240) Инкапсуляция - это в первую очередь про данные. Попробуй данные в модуль запихнуть )
242 Конструктор1С
 
10.12.19
08:01
(241) не-а, инкапсуляция это про скрытие деталей реализации. Скрытие данных тут скорее побочный бонусный эффект
243 d4rkmesa
 
10.12.19
08:46
(0) СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(...) - там, где СтрШаблон недоступен.
244 vi0
 
10.12.19
08:59
(216) "Платформа 1с это уже сам по себе некий стандарт"
"В то же время, на том же FoxPro городили кто во что горазд"
Потому что 1с - это фреймворк, а фокспро - БД.
245 тарам пам пам
 
10.12.19
09:07
(240) Мне лично в модулях нет нравится то, что из служебных модулей типа КлиентСервер и ПовтИсп их "потроха" торчат наружу в виде служебного интерфейса и приходится пользоваться соглашением, что на клиенте используем только модуль с припиской Клиент, на сервере - только вообще без приписок.
Также торчат наружу всякие подписки на события и обработчики регл. заданий.
Ну и обработчики оповещений тоже.

Так что инкапсуляция получается далеко не полной.
246 тарам пам пам
 
10.12.19
09:08
(243) эти функции, кстати, не равнозначны - СтрШаблон падает при отсутствии локализованной строки, а ПодставитьПараметрыВСтроку() - не падает.
247 ДенисЧ
 
10.12.19
09:14
(244) Фокс - это не БД. Это СУБД.
248 Bro
 
10.12.19
09:18
(247) Строго говоря там логика представлений тоже была и достаточна развитая. Ну и много чего еще было. Так что все-таки это ближе к платформе было. Только она с внешними SQL дружила где-то на уровне Delphi, а когда SQL стал де факто стандартом в отрасли, все преимущества сошли на нет и Microsoft логично сделала ставку на .Net, похоронив Foxpro.
249 Bro
 
10.12.19
09:19
(248) Точнее даже так: на .Net и Axapta, причем их начали сильно сближать друг к другу, X++ используемый в Axapta сейчас очень похож на C#.
250 hi1C
 
10.12.19
09:21
(178)Это самое крутое что я видел за последние 3 года, да блин я с 7.7 таких хаков не встречал. Это просто песня!
251 hi1C
 
10.12.19
09:25
(249) Бро, у тебя во Фузине костыли есть? Делись :)
252 trad
 
10.12.19
09:28
(241) (242) согласен с ДенисЧ
толку от инкапсуляции реализации, без возможности завернуть в нее данные (состояние объекта) - не много
253 Bro
 
10.12.19
09:43
(251) В самой фузине или в решениях на фузине?
254 hi1C
 
10.12.19
09:46
(253) в решениях
255 vi0
 
10.12.19
10:09
(247) не может быть такого)
256 Bro
 
10.12.19
10:09
(254) Ну то что сходу могу вспомнить:
При расчете себестоимости она выделяется в новый цикл в транзакции, а потом разбивается на итерации.
https://github.com/lsfusion-solutions/mycompany/blob/c2ca9254b4dce33988073b5b1d7ee105029561a0/src/main/lsfusion/inventory/ledgers/CostLedger.lsf#L47

Плюс например в ERP очень сильно намудрили с видами цен, замкнув все на одну функцию цена от любого вида цены (а видов цен там десятки, а то и сотни). Соответственно если начать компилировать из этого один запрос он получится очень большим. В итоге иногда делают выверты с событиями на изменения видимой части таблицы:

// определяется когда пересчитывать отображаемую цену.

WHEN LOCAL FORMS userOrder (SET([ VIEW userOrder.sts](Stock stock, Sku sku)) AND currentUserOrderUserOrder() = UserOrder o) OR     
                        ((CHANGED(priceDateTime(o)) OR    
                          CHANGED(priceListType(o)) OR    
                          CHANGED(agreement(o))) AND [ VIEW userOrder.sts](stock, sku)) DO     
    updateViewPrice(sku, stock, o);    
;    

// читают цену в локальное свойство (временную таблицу), причем пометка NOINLINE означает что надо выполнять FOR по каждому виду цены в отдельности, а по складам, товарам и датам одним запросом

updateViewPrice (Sku sku, Stock stock, UserOrder userOrder)  {
    FOR PriceListType pt = priceListType(userOrder, sku) AND (Stock st = IF overPriceStockUser(userOrder) THEN overPriceStockUser(userOrder) ELSE stock) AND stock IS Stock AND DATETIME dt = priceDateTime(userOrder) NOINLINE (pt) DO
        viewPrice(sku, stock, userOrder) <- prevPriceB(pt, sku, st, dt);
}

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

Ну и мелочи которые недоделали. Например отсутствие вывода типа из равенства (то есть PriceListType в примере платформа могла бы сама определить), ну и в таком духе из чего иногда получаются java проблемы вроде Борщ борщ new Борщ.
257 Mort
 
10.12.19
10:14
Процедура ПриЧтенииСозданииНаСервере()
{


}
258 hi1C
 
10.12.19
10:20
(257) в чем костыльность? простите я не понял
259 hi1C
 
10.12.19
10:31
(256) интересно, разработчики платформы так же отслеживают костыли?
260 Mort
 
10.12.19
10:33
(258) В том, что практически в каждой форме объекта эта конструкция нагорожена. Просто отсутствует удобный обработчик формы для заполнения реквизитов формы зависящих от данных объекта (вне зависимости от того новый он или нет).
261 hi1C
 
10.12.19
10:38
(260) меня фигурные скобки сбили с толку, типовые конфигурации?
262 Bro
 
10.12.19
10:47
(259) Интересный вопрос. Потому как природа человека такая что если он нашел workaround, он часто не то что не зарепортит, а наоборот будет ходить довольный какой он умный. :) Думаю при разработки типовых в 1С та же фигня.
263 Конструктор1С
 
10.12.19
10:51
(244) вообще фокспро СУБД, но использовалась она для тех же целей, что и 1с
264 Конструктор1С
 
10.12.19
10:55
(252) ну как это нет толку? Помнишь эпопею со ставками НДС в конце прошлого года? Добавилось новое значение перечисления СтавкиНДС, а меняли код в тыще мест. Этого не было бы, если бы расчет размера НДС был инкапсулирован в отдельном модуле. Тогда обошлось бы исправлением нескольких строк кода
265 hi1C
 
10.12.19
11:25
(264) это и без ООП можно реализовать
266 pechkin
 
10.12.19
11:29
сейчас вообще в моде функциональщина, там ооп не нужно
267 pechkin
 
10.12.19
11:29
(264) основная проблема в запросах, там никак общим модулем не обойдешься.
ибо функций для запросов нет
268 Конструктор1С
 
10.12.19
11:33
(265) естественно. Я про то и пишу, что инкапсуляция возможна и без ООП
269 Bro
 
10.12.19
11:34
(266) функциональщина и наследование / полиморфизм (а это основа ООП) это строго говоря две перпендикулярные вещи.
270 Конструктор1С
 
10.12.19
11:36
(267) это уже вопрос написания кода и запросов. Достаточно оставить болезненную, но популярную манеру делать вычисления в запросе, и всё будет тип-топ. В отчетах на СКД можно подтянуть глобальную функцию, в простых запросах делать все расчеты при выборке
271 pechkin
 
10.12.19
11:38
(269) речь про то что ооп - это стейт, а функциональщина - это как раз отсутствие стейта
272 hi1C
 
10.12.19
11:47
(271) интересная статья на эту тему https://habr.com/ru/post/479238/
273 Fragster
 
гуру
10.12.19
11:49
(235) сама идея делать это циклом - тоже говнокод
274 hi1C
 
10.12.19
11:50
(270) текст запрос можно собирать
275 hi1C
 
10.12.19
12:01
Выжимка из https://habr.com/ru/post/479238/: Отсутствие эффектов это единственное требование, которое нужно соблюдать, чтобы программа была функциональной.
276 Fragster
 
гуру
10.12.19
12:04
(275) ну так не пиши инчего в базу тогда
277 pechkin
 
10.12.19
12:12
(274) это как раз bad practice
278 pechkin
 
10.12.19
12:12
(276) там решается через DI  и проброса объекта записывающего в базу
279 Fragster
 
гуру
10.12.19
12:41
(278) нет, это не ФП.
280 hi1C
 
10.12.19
13:09
(277) коллеги подсказывают, что в ЗУПе применяется очень активно сбор текста запроса
281 pechkin
 
10.12.19
13:12
(280) зуп - это воообще сборник лютых bad practice
282 pechkin
 
10.12.19
13:13
(279) ну так сам объект пишущий не фп, а все останое фп
283 Конструктор1С
 
10.12.19
13:32
(280) ну это не значит, что надо делать также
284 Paint_NET
 
10.12.19
13:33
(280) Опыт подсказывает, что модули ЗУПа писали крайне упоротые наркоманы.
285 Cyberhawk
 
10.12.19
13:34
(273) А возведение в степень - не цикл?
286 Fragster
 
гуру
10.12.19
13:39
(285) не всегда, и что там в процессоре при этом происходит - хз вообще. Факт в том, что на языке платформы писать 5 операторов вместо одного - неправильно.
287 palsergeich
 
10.12.19
14:02
(284) Дык дело не в конфе.
Разработчики ЗУП для того что бы разрабатывать должны быть упороты так же как и законотворцы, если не дунуть то ничего не получится (Амаяк Акопян)
288 palsergeich
 
10.12.19
14:03
(285) возведение в степень можно реализовать байтодрочерством, я помню на лабах в c++ мы делали такую хрень
289 mistеr
 
10.12.19
14:37
Поделюсь тем, что бесит меня, хоть костыля нет (и бесит в т.ч. потому, что и костыля не сделать). Невозможность обхода результата запроса (произвольного) без загрузки его целиком в память.

По сабжу. Не всё, что "могло бы быть в платформе", должно быть непременно в платформе. Например, ПроверитьПараметр() - вполне норм.
290 mistеr
 
10.12.19
14:40
(289) Надеюсь, в фузине это не проблема )
291 hi1C
 
10.12.19
14:41
(289) ПроверитьПараметр - это было бы не нужно, если бы можно было типизировать параметры методов.
292 pechkin
 
10.12.19
14:42
а что значит ПроверитьПараметр?
293 hi1C
 
10.12.19
14:43
(292) см (218)
294 mistеr
 
10.12.19
14:46
(291) Нужно. Параметры бывает нужно проверять не только на тип. Но в слабо типизированных языках — ещё и на тип. Это нормально.

А бывает, не нужно проверять тип, например, любая коллекция годится.
295 hi1C
 
10.12.19
15:16
(294) хотел написать про то что было бы хорошо если бы платформа проверяла тип, но передумал
2 + 2 = 3.9999999999999999999999999999999...