Использование программных перечислений, ч.1: строковые константы

Публикация № 566908 10.12.16

Приемы и методы разработки - Практика программирования

Часто ли у вас возникает необходимость в коде выполнять сравнение на строку?

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

 
 1. Концепция
 
 2. Примеры использования

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

  • Ленивой инициализации - расчет значения будет выполнен только один раз - при первом обращении (см. вики)

  • устранению дублирования кода

  • повышению читабельности кода

Продолжение здесь Программные перечисления, ч.2: приемы кэширования при разработке

Специальные предложения

Вознаграждение за ответ
Показать полностью
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. VitaliyCeban 430 12.12.16 12:31 Сейчас в теме
Хорошее решение, разве что только скобки () глаза мусолят, но это терпимо.
Вот бы сделали "свойства", как в C#. С виду, обычные поля, а на деле - методы.
Хотя, если уж вносить изменения в встроенный язык 1С, то относительно этой задачи, надо сразу enum'ы делать.
dj_serega; demkonst; +2 Ответить
6. alex-l19041 8 12.12.16 17:16 Сейчас в теме
(1)
Хорошее решение
- можно уточнить о чем идет речь ? (обсуждается какая-то публикация ?)
7. unichkin 1415 12.12.16 17:26 Сейчас в теме
Что-то на ИС с комментариями, не видел (1) и (2)
(1) Ну да, мозолят) Идея использовать структуру для этих целей и появилась после того как прочитал чей-то коммент про отсутствие таких вещей в 1С, там тоже человек с любовью С вспоминал)
(6) я так понимаю, текущая ;)
2. пользователь 12.12.16 12:35
Сообщение было скрыто модератором.
...
3. CyberCerber 893 12.12.16 14:06 Сейчас в теме
Главная проблема, что для этого перечисления не сработает контекстная подсказка. Т.е. все равно придется идти и смотреть, какие значения бывают, копировать, вставлять...
Ali1976; dabu-dabu; TeMochkiN; AnderWonder; jaroslav.h; rpgshnik; demkonst; NN2P; pikachu94; TreeDogNight; minimajack; Yakud3a; Zhilyakovdr; 7OH; Krio2; Danila-Master; herfis; kraynev-navi; tormozit; mindcannon; +20 Ответить
4. JohnGalt 54 12.12.16 16:56 Сейчас в теме
Актуальная проблема. Исходя из собственного опыта, лучше все настройки, в том числе и сравнения "повесить" на пользователя. Назначить ответственных за механизмы/процессы. Для этого лучше всего сделать справочник или несколько с набором реквизитов/табличных частей для различных настроек. И настройки получать, например, ПриНачалеРаботыСистемы()
5. unichkin 1415 12.12.16 17:12 Сейчас в теме
(4) Ну, тут речь не совсем об этом. Вам к уже введенным настройкам надо как-то обращаться в коде. То что должен быть момент передачи ответственности - полностью согласен, как и с тем что лучше такое реализовать пользовательской настройкой. Только имхо, это не взлетит в 90% случаев фикси. Но это уже тема для отдельной беседы)
8. v3rter 12.12.16 17:29 Сейчас в теме
9. корум 285 12.12.16 17:35 Сейчас в теме
(8) это скорей не автор забыл, а движок инфостарта заглючил...
14. unichkin 1415 12.12.16 19:20 Сейчас в теме
(8)(10) не понял вопросов?
(11) Любую коллекцию параметров удобно так использовать - посмотрите последний пример с планом счетов. В примере - сравниваются значения структуры. Ну добавьте такой элемент:
СтруктураСтатусыЗаявок.Вставить("ТоварВПути"    , "Товар в пути");
10. v3rter 12.12.16 17:49 Сейчас в теме
Если взять не общий случай - ветвление кода, а частный - выбор набора параметров или макета, то чем плох обыкновенный справочник?
11. shurik_shurik 12.12.16 17:57 Сейчас в теме
Это очень хорошо, если во входящем файле статусы заявок без пробелов записаны. А если с пробелами, как тогда поступать?
Идея конечно интересная.
37. IvSchekin 22.03.18 08:44 Сейчас в теме
(11) не надо останавливаться на приведению к какому то регистру, надо еще удалять крайние пробелы и заменять два пробела на один дважды, тогда строка боле менее приводится к нормальному виду.
Selena--1; +1 Ответить
12. пользователь 12.12.16 17:57
Сообщение было скрыто модератором.
...
13. herfis 428 12.12.16 18:16 Сейчас в теме
Честно говоря, профита не так много как хотелось бы.
Но уже одно то, что в рантайме упадет сразу в том месте, где была ошибка в названии перечисления, дорогого стоит.
Т.е. в сложных случаях имеет смысл использовать. В простых - вряд ли.
the1; 7OH; zqzq; +3 Ответить
15. unichkin 1415 12.12.16 19:35 Сейчас в теме
(13) Основной профит - в удобной структуре кода. Кроме того, автоматически получается оптимизация - в том смысле что коллекция параметров не будет рассчитываться по 10 раз подряд. Неоднократно видел как люди в цикле пишут что-то вроде сч70_1_1 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("70.1.1").
В каких случаях использовать - я теперь только так работаю, если есть несколько строковых констант, даже не задаюсь вопросом "надо ли". Это похоже на рассуждение: "зачем оформлять код по правилам ИТС, для своей разовой доработки?" - т. е. человек не понимает зачем вообще его нужно оформлять, не видит в чем удобство. Я например даже для небольших работ все оформляю - это копейки времени, которые окупаются с лихвой если из разовой доработки понадобится ваять что-то серьезное, или передать кому-то на анализ, или вспомнить что делалось через полгода. Это на подкорке. Чтобы я забыл код оформить - никогда такого не было. Также и здесь. Но это конечно мое "имхо")
Garik8866; Артано; for_sale; uncle_Vasya; nihfalck; +5 Ответить
17. herfis 428 13.12.16 10:20 Сейчас в теме
(15) "Основной профит - в удобной структуре кода". Не согласен. "Структура кода" удобнее не становится. Я не про счета и кэширование (это уже несколько про другое), а про саму идею программных перечислений. В плане удобства - получаем сомнительный аргумент "красивенько" против дополнительного времени на реализацию и въезжание постороннего программиста в этот код. Вот своевременное падение в рантайме для легкого поиска ошибки - это профит. Если бы во время компиляции ругалось - это вообще был бы всем профитам профит. А если бы еще и автокомплишн в конфигураторе - практически полноценные перечисления бы вышли.
AnderWonder; zqzq; uncle_Vasya; 7OH; +4 Ответить
18. unichkin 1415 13.12.16 11:05 Сейчас в теме
(17) Именно в нем. "Тупой код с хорошей структурой, лучше чем тупая структура с гениальным кодом". Про время на реализацию - расхожее заблуждение. Дровосек рубит деревья, у него спрашивают - мужик, че ты мучаешься, у тебя ж топор тупой. Наточи топор. А он отвечает: "мне НЕКОГДА! мне надо РУБИТЬ". И все "рубят". Код должен читаться как книга.
По приоритету, для меня так:
- "въехать" в это можно достаточно быстро
- при этом можно быть уверенным что коллекция заполняется только в одном конкретном месте, благодаря использованию фиксированной структуры
MTK_Rosberg; Артано; for_sale; uncle_Vasya; borrman; +5 Ответить
16. vasilev2015 2349 13.12.16 10:15 Сейчас в теме
Может, лучше использовать соответствие ?
Синтаксис похожий, плюшек больше.
Подходит для больших списков.
mvxyz; the1; vvirus; +3 Ответить
19. unichkin 1415 13.12.16 11:06 Сейчас в теме
(16) Используйте то, что вам удобнее) Но соответствие не выдаст исключения при получении отсутствующего значения, а вернет неопределено. У него несколько иное назначение, чем у структуры.
for_sale; sulfur17; +2 Ответить
20. =Kollega= 3 13.12.16 14:39 Сейчас в теме
Идея хорошая, но все же ИМХО лучше один раз вызвать функцию и вернуть в локальную переменную структуру и работать с ней, чем 10 раз вызывать и проверять, проиницилизирована ли нужная нам структура.
Но это так просто придирка, хотя когда подобных структур будет достаточно много (хотя я даже не представляю себе род такой задачи), поиск и копирование структур может стать достаточно ощутимым.
for_sale; m_sb; the1; +3 Ответить
21. herfis 428 13.12.16 16:19 Сейчас в теме
(20) Тут как раз все в порядке.
Во-первых, ленивая инициализация - это само по себе хорошо.
Во-вторых, явная инициализация на старте - это еще одна "точка привязки" в коде для реализации этой концепции. Абсолютно лишняя.
ЗЫ. Поиск в структуре по ключу не должен стать ощутимым, даже если ключей будет много. Если я правильно помню - это хэшированная структура данных. Ну, разве что свопить начнет :) А копирования тут нет.
22. PLAstic 280 13.12.16 18:08 Сейчас в теме
Не имею возможности изучить каменты. А автору уже намекнули на то, что надо вынести инфу в табличный макет и грузить соответствия из него?
23. DrAku1a 1471 14.12.16 09:40 Сейчас в теме
Мне кажется, что автор начиная со первого примера "СтруктураСтатусыЗаявок" забыл про своё-же замечание: (буква "О" <> "о").
ehoes; корум; belchonokh; klinval; dimk@a; +5 Ответить
26. unichkin 1415 14.12.16 13:10 Сейчас в теме
(23)
Мне кажется, что автор начиная со первого примера "СтруктураСтатусыЗаявок" забыл про своё-же замечание: (буква "О" <> "о").
- не вижу ошибки, ткните пальцем если не сложно.
(24) Я думаю, если дорабатываете конфу - то добавьте нормальное перечисление.
Этот способ хорош для константных значений, уникальных в каком-то определенном алгоритме (внешнем или внутреннем). Например - статусы заявок приходят к нам в виде текста. Но в конфигурации это наверняка перечисление. Здесь структура нужна только для того, чтобы удобно и качественно проверять все входящие значения статусов.
Еще пример с потолка (кривая методология, просто чтобы отразить суть вопроса): скажем в документе оператор заполняет строковое поле "Причина отказа". Причина может вводиться как из заранее определенного списка, так и произвольно - если установлен соотв. флаг. Так вот - если не добавлять в конфигурации нормальное перечисление (а лучше добавить, сделав "причину" составным полем), то да, наверное логично так сделать. Только модуль ПовтИсп хранит кэш 20 минут. Возможно лучше использовать какие-то существующие кэши конфигурации. И "мСтруктураКэшПрограммныхПеречислений" не будет нужна только для этого конкретного случая.
(25) Если рассуждать только с позиции загрузки заявок - то конечно, да, лучше дать на откуп пользователю. А еще лучше проговорить это все в ТЗ. Потом при формировании структуры перечисления собрать данные из таблицы формы - да, логично, почему нет. Но загрузка заявок - это ведь частный случай, я его использовал для примера. У меня например была задача, в которой я создавал программное перечисление для событий журнала регистрации. Т.е. было примерно так:
СтруктураСобытийЖурнала = Новый Структура();
СтруктураСобытийЖурнала.Вставить("НачалоСеанса", "_$Session$_.Start");
СтруктураСобытийЖурнала.Вставить("КонецСеанса", "_$Session$_.Finish");
СтруктураСобытийЖурнала.Вставить("Проведение", "_$Data$_.Post");
// ну и т. д.

Потом для фильтров использовал СобытияЖР().Проведение и т.п.
Артано; корум; sulfur17; +3 Ответить
24. sulfur17 40 14.12.16 11:44 Сейчас в теме
А можно функцию СтатусыЗаявок() разместить в глобальном общем модуле с повторным использованием возвращаемых значений на время сеанса?
Тогда и переменная мСтруктураКэшПрограммныхПеречислений не нужна и можно будет использовать СтатусыЗаявок() в других модулях.

Например если я хочу передать СтатусыЗаявок().Отказ в качестве параметра из другого модуля, то в другом модуле функцию СтатусыЗаявок() не видно. А если разместить ее в глобальном модуле, то будет видно.
unichkin, Что об этом думаете?
25. корум 285 14.12.16 11:55 Сейчас в теме
(0) Более другой вариант.
Заполнять такие перечисления в таблицы на форме, проводить программное сопоставление, окончательную корректировку оставлять пользователю.
Обработку данных производить с учетом полученных таблиц соответствий (количество значений в которых неопределено и разработчика не волнует - он работает со стандартным справочником/перечислением из соответствия)

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

обработаются одинаково корректно.
27. German_Tagil 35 15.12.16 07:58 Сейчас в теме
28. vlad.frost 187 15.12.16 09:35 Сейчас в теме
Если инвертировать проверку свойства в мСтруктураКэшПрограммныхПеречислений, то это позволит уменьшить уровни вложенности и код будет читаться легче. Сравните:

Функция СтатусыЗаявок()
	
	Если мСтруктураКэшПрограммныхПеречислений.Свойство("СтатусыЗаявок") Тогда		
		Возврат мСтруктураКэшПрограммныхПеречислений.СтатусыЗаявок;
	КонецЕсли;

	СтруктураСтатусыЗаявок = Новый Структура;
	СтруктураСтатусыЗаявок.Вставить("НаУтверждении", "НаУтверждении");
	СтруктураСтатусыЗаявок.Вставить("ТоварвПути", "ТоварВПути");
	СтруктураСтатусыЗаявок.Вставить("КОтгрузке", "КОтгрузке");
	СтруктураСтатусыЗаявок.Вставить("Отказ", "Отказ");
					
	мСтруктураКэшПрограммныхПеречислений.Вставить("СтатусыЗаявок", Новый ФиксированнаяСтруктура(СтруктураСтатусыЗаявок));
	
	Возврат мСтруктураКэшПрограммныхПеречислений.СтатусыЗаявок;
		
КонецФункции
Показать
TeMochkiN; Daruma; ValentinGushchin; dj_serega; +4 Ответить
29. unichkin 1415 15.12.16 10:09 Сейчас в теме
(28) Я обычно стремлюсь к сокращению "Возвратов", если можно рассчитать значение внутри функции и вернуть результат в конце метода - так и делаю; приведенный вами код не кажется мне более читабельным решением, может дело вкуса. Делайте как вам удобнее) Я останусь при своем.
Кстати, сейчас подумал - что в функциях обычно минимизирую возвраты, а в процедурах как раз наоборот - если есть условие прерывания, стараюсь выполнить его в самом начале, чтобы не использовать лишних расчетов.
30. vlad.frost 187 15.12.16 13:54 Сейчас в теме
(29) Единая точка выхода, ага, нас тоже так в школе учили. Но если уж вы предлагаете способы, как улучшить читаемость кода, идите дальше. Согласен, в приведённом мной примере данное изменение не сильно улучшит читаемость, но примените его к вашей функции ИспользуемыеСчета(), и там такое улучшение будет уже более актуально. Матчасть: Замена вложенных условных операторов граничным оператором.
ValentinGushchin; +1 Ответить
31. unichkin 1415 15.12.16 16:41 Сейчас в теме
(30) Да нет в "ИспользуемыеСчета()" ветка условия всего одна, так что принцип тот же что и в (29). То, что описывает приведенная вами статья я стараюсь соблюдать, и это как-то всегда на уровне спинного мозга осознавал - что не стоит допускать дебрей Case-Of Если-Тогда. Однако за наводку и интерес к моей статье - спасибо)
Мне в данном конкретном случае кажется более логичным заполнять структуру именно внутри условия. Возможно потому, что основные цели этих методов (для вызова программного перечисления) - это заполнение соотв. кэша, и более логично в начале алгоритма видеть инициализацию коллекции по условию ее отсутствия. Тут с т.з. рефакторинга было бы неплохо вынести код по заполнению структуры счетов в внешний метод, но я не люблю перегружать программный интерфейс методами (пусть даже и служебный). Т.е. использоваться -то он будет все-равно только в одном месте. Вот если его глобальным сделать, тогда другое дело. Было бы нечто вроде такого:
Функция ИспользуемыеСчета()
	
	Если НЕ мСтруктураКэшПрограммныхПеречислений.Свойство("ИспользуемыеСчета") Тогда
		СтруктураИспользуемыеСчета = Новый Структура;
		
		// Чтобы добавить счет, добавьте сюда его код
		СтрокаКодовСчетов = "10, 10.3, 19, 60.1, 60.2, 62, 51, 51, 70, 70.1, 76.АВ, 90, 90.01, 90.02";
		СтруктураИспользуемыеСчета = ОбщегоНазначенияБП.СтруктураСчетовПоСтрокеКодов(СтрокаКодовСчетов );

		мСтруктураКэшПрограммныхПеречислений.Вставить("ИспользуемыеСчета", Новый ФиксированнаяСтруктура(СтруктураИспользуемыеСчета));
	КонецЕсли; 	
	
	Возврат мСтруктураКэшПрограммныхПеречислений.ИспользуемыеСчета;
	
КонецФункции
Показать
32. neikist 29.12.16 20:38 Сейчас в теме
Понимаю что поздновато отписываюсь, но как вам такой вариант?

#Область ПрограммноеПеречисление_СтатусыЗаявок

Функция _СтатусыЗаявок_НаУтверждении()	Возврат "НаУтверждении"	КонецФункции
Функция _СтатусыЗаявок_ТоварВПути()		Возврат	"ТоварВПути"		КонецФункции
Функция _СтатусыЗаявок_КОтгрузке()			Возврат	"КОтгрузке"		КонецФункции
Функция _СтатусыЗаявок_Отказ()			Возврат	"Отказ"			КонецФункции


#КонецОбласти

Функция ДанныеФайлаУспешноСчитаны() Экспорт
	
	//...
	СтатусЗаявки = СокрЛП(Excel.Cells(1, Сч).Text);

	Если СтатусЗаявки = _СтатусыЗаявок_НаУтверждении() Тогда
		//...		
	ИначеЕсли СтатусЗаявки = _СтатусыЗаявок_ТоварВПути() Тогда
		//...		
	ИначеЕсли СтатусЗаявки = _СтатусыЗаявок_КОтгрузке() Тогда	
		//...		
	КонецЕсли; 

	Возврат Истина; 		
	
КонецФункции
Показать



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

Минусов с ходу могу назвать только два:
1. Засорение контекстной подсказки, для чего и добавил в начало _;
2. Такое "перечисление" не передашь в другой модуль, разве что вместе со всем текущим контекстом (ЭтотОбъект придется передавать из общего модуля или формы) и делать данные функции экспортными.
33. unichkin 1415 29.12.16 23:51 Сейчас в теме
(32)
1. Объявляете реквизит формы "СтруктураКэшПрограммныхПеречислений", с произвольным типом реквизита... А остальное все то-же) Это если для формы. Вообще правильнее все-же к форме относить то, что касается *формы* - интерактив, все расчеты лучше отправлять на сервер, т.е. в модуль объекта. Ну тут можно много рассуждать и говорить - по всякому можно. Если говорим о внешней обработке можно сделать реквизит обработки произвольного типа - он будет доступен и с сервера и с клиента. Если о объекте конфигурации - сделайте реквизит формы. Или - вызов из модуля ПовтИсп.
2. Если учесть что различие только в префиксе - имхо, не очень удобно для набора, когда много коллекций.
С моей точки зрения, когда перечисление обосабливается в свой метод - это и нагляднее и удобнее. Ну да, синтакс контроль не заругается. Пишите аккуратнее) Каждому свое конечно, используйте то что вам больше подходит. Но мне с таким кодом было бы работать тяжеловато. Подчеркивание в начале метода - это нарушение правил образования имен переменных. Ну и плюшки с ленивой инициализацией теряются.
Vortigaunt; +1 Ответить
34. tailer2 20.01.17 18:31 Сейчас в теме
>через предопределенный список элементов плана счетов, т.е. туда надо провалиться, найти код счета, скопировать имя... - долго

на этот случай имена счетов сохранены в отдельном файлике, открыл, скопипастил
35. SergeyFirst 70 19.09.17 12:05 Сейчас в теме
Красиво и лаконично! Молодца!
36. Tapochki-tmn 43 22.03.18 08:26 Сейчас в теме
Возможно, я чего-то не понял, но мне кажется в коде примера использования ошибка.

Строка "ВидОпределенияКонтрагента = ВидыОпределенияКонтрагента().Контрагент;" не корректна, т.к. структура СтруктураВидыОпределенияКонтрагента не содержит свойства "Контрагент", зато содержит "Документ".

И чтобы сработало вот это:

Если СвойстваИсточника().ВидОпределенияКонтрагента = ВидыОпределенияКонтрагента().Документ Тогда
Контрагент = мИсточник.Контрагент;

наверное, нужно было написать так:

Если ТипЗнч(мИсточник) = Тип("ДокументОбъект.РеализацияТоваровУслуг") Тогда
ВидОпределенияКонтрагента = ВидыОпределенияКонтрагента().Документ;

Сори, если туплю...
Но может кому сбережет нервы при копипасте примера :)
unichkin; +1 Ответить
38. unichkin 1415 22.03.18 10:52 Сейчас в теме
(36) Все верно, спасибо, поправил
39. Sei Souma 23.03.18 19:39 Сейчас в теме
Идея неплохая,но вообще удобнее чем работать с макетами в которых все зашито ничего опытным путем найдено не было.
40. webester 35 24.03.18 13:11 Сейчас в теме
Прошу прощения за глупые вопросы. Но вся суть это длинной статьи, отсылки на вики, простыней кода, заключаются в фразе: "Если вам нужно использовать несколько строк в операторах сравнения, используйте структуру" ? Или я чего то не заметил?
41. Digest08 21.05.18 08:33 Сейчас в теме
42. markers 257 15.08.19 07:49 Сейчас в теме
Если религия не запрещает, то можно использовать сами чистокровные перечисления без регистрации, смс и совершенно без серверных вызовов, спросите как? Очень просто!
1) Создаем реквизит формы произвольного типа, Назовем её к примеру "Переч_Статусы"
2) При создании формы на сервере (или любой другой метод, выполняющимся одним из первых на сервере) выполняете такой код для нужных перечислений:
Переч_СтатусыВрем = Новый Структура;
Итератор = 0;
	
Для Каждого стр из Метаданные.Перечисления.Статусы.ЗначенияПеречисления Цикл
		
	Переч_СтатусыВрем.Вставить(стр.Имя, Перечисления.Статусы[Итератор]);
	Итератор = Итератор + 1;
		
КонецЦикла;
	
Переч_СтатусыВрем.Вставить("ПустаяСсылка", Перечисления.Статусы.ПустаяСсылка());
Переч_Статусы = Новый ФиксированнаяСтруктура(Переч_СтатусыВрем);
Показать
Если перечислений много, можно использовать фиксированное соответствие, так вообще будет похоже на штатное перечисление
3) Там где надо получить значения перечисления пишите так:
Если Статус = Переч_Статусы["Готово"] Тогда
	// Ваш код
КонецЕсли;
Так можно без вызова сервера проверять/устанавливать значения перечислений, единственный минус, это отсутствие подсказки, но если вы ошибётесь в копипейсте значения перечисления при вставке в код, то так-же как и в данной публикации, будет выдана ошибка при выполнении.
PS: Так как это реквизит формы, а не переменная, то данный код можно использовать и на сервере (дабы не мучить базу лишними запросами).
43. unichkin 1415 18.08.19 14:06 Сейчас в теме
(42) Клиент-серверный кэш на форме нужен крайне редко. Кэшировать именно значения предопределенных элементов \ значения перечислений самостоятельно не требуется - для этого есть метод "ПредопределенноеЗначение". В том случае если на форме нужен кэш - это бывает, когда архитектурно невозможно вынести код в модуль объекта, можно также использовать глобальную переменную (в данные формы таблицу значений например не поместишь). Я это делаю примерно так:

&НаСервере
Перем мСтруктураКэшДанных;

//... 

&НаСервере
Функция КэшСервера()
	Если мСтруктураКэшДанных = Неопределено Тогда
		мСтруктураКэшДанных = Новый Структура;
		
	КонецЕсли; 
	
	Возврат мСтруктураКэшДанных;
	
КонецФункции

&НаСервере
Функция ДокументыКАнализу()
	
	Если НЕ КэшСервера().Свойство("ДокументыКАнализу") Тогда
		
		ДокументыКАнализу = Новый Массив;		
		//... 	
		КэшСервера().Вставить("ДокументыКАнализу", ДокументыКАнализу);
	КонецЕсли; 
	
	Возврат КэшСервера().ДокументыКАнализу;
	
КонецФункции

Показать
44. markers 257 18.08.19 14:32 Сейчас в теме
(43)
ПредопределенноеЗначение
я возможно сделаю для вас открытие, но данный метод делает серверный вызов и если сервер рядом, этим можно и пренебречь, но я как-то заметно ускорил РМК из 1С:Розница 2.2 особенно на слабом интернете, заменив ПредопределенноеЗначение на нечто подобное описанное в (42) ничего не потеряв при этом.
TeMochkiN; acanta; +2 Ответить
45. unichkin 1415 18.08.19 14:35 Сейчас в теме
(44) я руководствуюсь этой статьей https://its.1c.ru/db/v8std#content:443:hdoc
"При этом не следует в прикладном коде реализовывать собственные механизмы кеширования на клиенте предопределенных значений. Функция ПредопределенноеЗначение не ухудшает клиент-серверное взаимодействие: серверный вызов выполняется только при первом обращении к значению, а результат автоматически кешируется в кеше конфигурации на клиенте до следующего обновления версии конфигурации или версии платформы."
з.ы. не умаляю ваших результатов, но по своему опыту - сначала делаю как сказано на ИТС, если не катит начинаю изобретать велосипеды. А "не катит" довольно редко, до сих пор только один случай могу вспомнить.
markers; acanta; +2 Ответить
46. markers 257 18.08.19 14:46 Сейчас в теме
(45) По моему субъективному опыту, кешируется на время сеанса. И это кеширование несколько дороговатое, если можно это сделать самостоятельно, один раз и при создании формы на сервере. Я ни чуть не осуждаю вас, но к сожалению должен констатировать, что 1С делая Розницу, походу полагала что сервер будет находится за стенкой с гигабитной сетью и будет всего один магазин. И там много где используются избыточные вызовы сервера и много где используется в том числе ПредопределенноеЗначение на клиенте. Даже просто запуск сеанса в рознице и то удалось сильно ускорить (не смотря на то, что там ещё и мои обработчики навешаны по мимо типовых) заменив в куче мест вызовы модулей с галочкой "вызов сервера" и даже с галочкой "повторное использование" заменив всё это тем, что получаю все эти необходимые значения в типовую глобальную переменную "ПараметрыПриложения" один раз, делая один серверный вызов и просто в местах где это вызывалось, заменил на получение значения из этой клиентской переменной. Конечно, таким способом можно ускорить только получение некой статичной информации, но я даже некоторую потенциально не статичную информацию засунул туда, только сделал кнопочку "Обновить" на всякий случай, которая требуется раз в пятилетку.
PS: Но в любом случае, спасибо за ссылку!
47. markers 257 18.08.19 15:01 Сейчас в теме
Да, ещё хочется припомнить 1С один курьёзный случай в РМК (Розница 2.2), точно его не помню, по этому опишу по своему:
&НаСервере
Процедура ЧтоТоДеламемНаСервере()
	а = НайтиЭлемент("а");	
КонецПроцедуры

&НаКлиенте
Процедура ЧтоТоДеламемНаКлиенте()
	б = НайтиЭлемент("б");
КонецПроцедуры

&НаСервере
Функция НайтиЭлемент(Имя)
	Возврат Элементы[Имя]; // Этот кусок я точно помню, именно для этого и вызывался сервер
КонецФункции
Показать
И вот этот "НайтиЭлемент" вызывался на клиенте при наборе и пробитии одного чека что-то около 40 раз. Мне даже те кто пользуются файловой базой, начали жаловаться на тормоза. Что уже говорить о том, когда клиент отнесен от сервера на десятки и сотни километров и работает через тонкий клиент. Но это просто у меня наболело, извините
48. It-developer 20 21.07.20 10:59 Сейчас в теме
Соответствие лучше структуры. Можно избавиться от такого кода
Если СтатусЗаявки = СтатусыЗаявок().НаУтверждении Тогда
//...
ИначеЕсли СтатусЗаявки = СтатусыЗаявок().ТоварВПути Тогда
//...
ИначеЕсли СтатусЗаявки = СтатусыЗаявок().КОтгрузке Тогда
//...
КонецЕсли;
имея соответствие такое же как исходная структура
49. Zurfik 18.09.20 12:19 Сейчас в теме
Видимо я что-то делаю не так. Почему-то всегда структура заново заполняется значениями, хотя после первого выполнения функции они должны кэшироваться. Код в модуле формы.


Перем КэшДанныхПараметров;

Функция СтруктураЗначениеОсновныхПараметров()
	
        //КэшДанныхПараметров - пустой при каждом вызове функции
	Если НЕ КэшДанныхПараметров.Свойство("ПроизвольнаяСтруктура") Тогда
		
		ЗначенияСтруктуры = Новый Структура;
		ЗначенияСтруктуры.Вставить("Параметр1","Строка");
		ЗначенияСтруктуры.Вставить("Параметр2","123");
		ЗначенияСтруктуры.Вставить("Параметр3",Истина);
		
		КэшДанныхПараметров.Вставить("ПроизвольнаяСтруктура", Новый ФиксированнаяСтруктура(ЗначенияСтруктуры));
		
	КонецЕсли;
	
	Возврат КэшДанныхПараметров.ПроизвольнаяСтруктура;
	
КонецФункции

&НаКлиенте
Процедура КомандаА(Команда) Экспорт
	
//первый вызов функции, КэшДанныхПараметров - пустой что логично 
	Если СтруктураЗначениеОсновныхПараметров().Параметр1 = "Строка2"Тогда 
		Сообщить(""); 
//второй вызов функции, КэшДанныхПараметров пустой.. 
	ИначеЕсли СтруктураЗначениеОсновныхПараметров().Параметр2 = 222 Тогда
		Сообщить(""); 
//третий, КэшДанныхПараметров пустой..
	ИначеЕсли  СтруктураЗначениеОсновныхПараметров().Параметр3
		Тогда Сообщить(""); 
	КонецЕсли;
	
	Структура = СтруктураЗначениеОсновныхПараметров();
	
КонецПроцедуры

КэшДанныхПараметров = Новый Структура;


Показать
50. unichkin 1415 18.09.20 12:25 Сейчас в теме
(49) Все правильно, серверный кэш живет столько же, сколько и серверный вызов. К сожалению, нормальный клиент-сервер в формах реализуется достаточно убого: через реквизит произвольного типа. При этом следует учитывать, что данные этого реквизита будут гоняться на сервер, т.е. лишний трафик.
Выводы - на клиенте клиентский кэш, на сервере - серверный. Причем на клиенте время жизни кэша - пока открыта форма, на сервере - на время серверного вызова.
51. Zurfik 18.09.20 12:29 Сейчас в теме
(50) Я форму не закрывал. Просто нажимаю кнопку на форме и у меня 4 раза отрабатывает заполнение структуры, в чем тогда смысл кэширования, если оно не работает? Получается то же самое что и функцию Нрег вызывать для каждого строкового значения как у вас в примере.
52. unichkin 1415 18.09.20 12:34 Сейчас в теме
(51) Вы не понимаете поведения формы. Набросал реализацию клиентского кэша, на вашем примере:

#Область ОписаниеПеременных

&НаКлиенте
Перем мКэшКлиент;

#КонецОбласти 

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура КомандаА(Команда)
	
	ОсновныеПараметры = ОсновныеПараметры();
    
    Если ОсновныеПараметры.Параметр1 = "Строка2"Тогда 
        Сообщить(""); 
		
    ИначеЕсли ОсновныеПараметры.Параметр2 = 222 Тогда
        Сообщить(""); 
		
	ИначеЕсли  ОсновныеПараметры.Параметр3 Тогда 
		Сообщить(""); 
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти 

#Область СлужебныеПроцедурыИФункции

#Область Сервис

&НаКлиенте
Функция КэшКлиент()
	Если мКэшКлиент = Неопределено Тогда
		мКэшКлиент = Новый Структура;		
	КонецЕсли; 
	Возврат мКэшКлиент;	
КонецФункции
 
#КонецОбласти 

#Область ПрограммныеПеречисления

&НаКлиенте
Функция ОсновныеПараметры()
	
	Кэш = КэшКлиент();
	Если НЕ Кэш.Свойство("ОсновныеПараметры") Тогда
        Результат = Новый Структура;
        Результат.Вставить("Параметр1","Строка");
        Результат.Вставить("Параметр2","123");
        Результат.Вставить("Параметр3",Истина);
		
		Кэш.Вставить("ОсновныеПараметры", Результат);
	КонецЕсли; 
	
	Возврат Кэш.ОсновныеПараметры;
	
КонецФункции 

#КонецОбласти 

#КонецОбласти

Показать
67. Zurfik 18.09.20 12:58 Сейчас в теме
(52) А области в вашем коде обязательно использовать или они только для читаемости кода необходимы?
#Область СлужебныеПроцедурыИФункции
#Область Сервис
#КонецОбласти 
#КонецОбласти
71. unichkin 1415 18.09.20 13:14 Сейчас в теме
(67) На работоспособность отсутствие областей не повлияет конечно, но мое мнение - *всегда*, при разработке чего угодно надо следовать ИТС: Соглашения при написании кода.
Это можно считать "библией" 1С-ника, и читать как молитву каждый день, пока не будет от зубов отскакивать.
53. unichkin 1415 18.09.20 12:35 Сейчас в теме
(51) + кэш на форме нужен достаточно редко. Пример из статьи реализовывается в модуле объекта, там где необходимо писать серверную логику. Форма - это только интерактив.
55. FatPanzer 18.09.20 12:37 Сейчас в теме
(51) Потому что вы его вызываете ровно 4 раза.
Прикрепленные файлы:
56. Zurfik 18.09.20 12:39 Сейчас в теме
(55) У АС то же самое. Это просто пример посмотреть как работает механизм, этот код нигде не используется и не будет.
Если СтатусЗаявки = СтатусыЗаявок().НаУтверждении Тогда
		//...		
	ИначеЕсли СтатусЗаявки = СтатусыЗаявок().ТоварВПути Тогда
		//...		
	ИначеЕсли СтатусЗаявки = СтатусыЗаявок().КОтгрузке Тогда	
		//...		
	КонецЕсли; 
Показать
58. unichkin 1415 18.09.20 12:41 Сейчас в теме
(56) Еще раз, см. (52): пример статьи реализован в модуле объекта.
59. Zurfik 18.09.20 12:42 Сейчас в теме
(58)
Спасибо. Я попробую с вашим кодом.
60. FatPanzer 18.09.20 12:43 Сейчас в теме
(56) У меня? Где? Это не мой код. Это код автора статьи. Но ему я бы тоже по рукам настучал бы. Вместо того, чтобы один раз проверить кэш в начале функции (и перезаполнить его при необходимости), а вызывать его проверку в каждой строке - это моветон.
62. unichkin 1415 18.09.20 12:46 Сейчас в теме
(60) АС - это и есть автор статьи :) С вашим предложением согласен, но мне эта идея пришла позднее. На самом деле, проверка наличия свойства структуры происходит настолько мгновенно, что практически не отражается на производительности. Переменную кэша я обычно выношу в начало метода (см. 52) - но в первую очередь для читабельности, чтобы скобки нигде не писать.
63. FatPanzer 18.09.20 12:47 Сейчас в теме
(62) Я думал, что это опечатка - "У ВАС то же самое..." )))
64. Zurfik 18.09.20 12:48 Сейчас в теме
(60) Под АС я имел ввиду Автор Статьи. У вас 5 звезд, если вы такой специалист напишите статью, пустая критика тоже моветон.
68. FatPanzer 18.09.20 13:01 Сейчас в теме
(64) Не уверен, что автор статьи нуждается в вашей защите ;-)
75. Zurfik 21.09.20 04:19 Сейчас в теме
(68) Где вы тут увидели защиту автора. Ваше высокомерие не оправдано, у вас нет ни одной интересной статьи. Может специалист вы и хороший, но какая польза от вашей пустой критики, почувствовать собственную важность? Вместо того, что бы сделать что-то полезное для комьюнити брызжете слюной во все стороны и гордитесь этим фактом. От того что вы новичка в 1с обкакаете вы лучше не станете, хотя если это единственный способ самоутвердиться, то ок )
76. unichkin 1415 21.09.20 10:25 Сейчас в теме
(75) Пожалуйста, не флудите здесь. Общайтесь через ЛС, например.
72. unichkin 1415 18.09.20 13:20 Сейчас в теме
(60) Да, пожалуй надо бы подкорректировать завтра, чтобы не смущать умы. Спасибо за замечание)
FatPanzer; +1 Ответить
73. FatPanzer 18.09.20 13:21 Сейчас в теме
74. unichkin 1415 18.09.20 13:28 Сейчас в теме
(73) у меня многие скиллы с помощью мисты прокачаны, с такой закалкой какие обиды :))
57. unichkin 1415 18.09.20 12:40 Сейчас в теме
(55) У человека явное непонимание разницы между клиентским и серверным методом, он такого объяснения не поймет. Тут надо отправлять учить матчасть
61. FatPanzer 18.09.20 12:45 Сейчас в теме
(57) У меня для таких случаев клиентсерверный модуль с повторным использованием. В начале работы клиентского/серверного метода или при открытии/создании формы прочитал из него закэшированные данные, и хватит на весь сеанс работы с формой или на весь сеанс работы серверного вызова...
65. unichkin 1415 18.09.20 12:49 Сейчас в теме
66. FatPanzer 18.09.20 12:54 Сейчас в теме
(65) Я знаю )) Я ленивую использую только в том случае, если логика решения подразумевает от факт, что какая-то служебная коллекция может НЕ пригодиться в течении жизни (в тех же условных ветвлениях) - тогда да, я добиваю такие служебные коллекции в кэш только в момент обращения.
Если же при разработке формы или метода я точно знаю, что она та или иная коллекция мне необходима безо всяких условий - я набиваю эти служебные коллекции в кэш сразу при старте.

Обычное поведение, ничего экстраординарного. Удивлюсь, если опытные бойцы поступают как-то по-другому...
69. unichkin 1415 18.09.20 13:04 Сейчас в теме
(66) Т.е. вы *явно* управляете этим. А с кэшированием, описанным в статье это выходит само собой)
70. FatPanzer 18.09.20 13:13 Сейчас в теме
(69) Ну почему же сразу явно. В случае использования ленивости - конечно же точно так же через проверку свойств кэша, то есть неявно.
Но иногда лучше явно. Как раз вы об этом и писали. Если по ходу алгоритма к коллекции необходимо обращаться несколько раз, то в каждом случае подставлять ленивку - ну так себе читабельность кода может получиться. Иногда корректнее в самом начале явно закэшировать.
Все зависит от прикладной логики, на самом деле. Например в инструментах настройки чего либо, которые используются раз в год - можно и сразу кэшировать не озираясь на ресурсоемкость. В часто выполняемых операциях (какие-нибудь общие модули печати) - имеет смысл экономить ресурсы.
unichkin; +1 Ответить
54. FatPanzer 18.09.20 12:35 Сейчас в теме
(49) В вашем коде надо уничтожать все от первой до последней буквы.
Оставьте свое сообщение

См. также

Аналог PIVOT в запросе 1С (как выполнить транспонирование таблицы в запросе 1С) Промо

Практика программирования v8 Бесплатно (free)

В статье показывается простой метод реализации аналога оператора PIVOT в запросе 1С без использования соединений.

12.12.2020    5251    Eugen-S    24    

СКД: 5 советов, как сделать лучше

Практика программирования v8 v8::СКД 8.3.14 Бесплатно (free)

Несколько примеров решения задач с использованием разных подходов

27.10.2021    5645    Neti    19    

Полезные примеры СКД, ч.2

Практика программирования v8 v8::СКД Бесплатно (free)

Еще несколько примеров решения задач в СКД.

06.04.2021    11883    Neti    8    

Неочевидные нюансы записи управляемой формы

Практика программирования v8 v8::УФ Платформа 1C v8.2 1cv8.cf Бесплатно (free)

Разберем несколько нюансов записи управляемой формы.

02.04.2021    14637    SeiOkami    54    

Использование классов .Net в 1С для новичков Промо

Разработка внешних компонент Универсальные функции Практика программирования v7.7 v8 Бесплатно (free)

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    86772    Serginio    116    

Обзор полезных методов БСП 3.1.4

БСП (Библиотека стандартных подсистем) Практика программирования v8 1cv8.cf Бесплатно (free)

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

25.03.2021    47318    rayastar    53    

Звуковое управление в 1С 8.3

Практика программирования v8 1cv8.cf Бесплатно (free)

В данной статье описано создание библиотеки для звукового управления (выполнение команд голосом) для платформы 1С 8.3. Задача была поставлена так, чтобы модуль функционировал непосредственно на клиенте 1С, осуществляя управление формами, и взаимодействовал с интерфейсом.

16.03.2021    7678    velemir    33    

Доработка проведения в ERP 2.5. (Регистры накопления, Регистры сведений)

Практика программирования v8 ERP2 БУ Бесплатно (free)

Покажу точки входа для доработки "типового" проведения документов в ERP для регистров оперативного учета. Рассмотрим три основные ситуации: нужно изменить имеющееся проведение документа; нужно сделать записи в существующие регистры; нужно с нуля описать алгоритм проведения в добавленный регистр. Пример реализован на 1С:ERP Управление предприятием 2 (2.5.4.120)

10.01.2021    11993    BuriyLesha    10    

Вспомогательные инструкции в коде 1С Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    36714    tormozit    107    

Serverless (Faas) в 1С. Создание и вызов Yandex Cloud Functions

Универсальные функции Практика программирования v8 Бесплатно (free)

"Я не могу просто взять и скопировать код с гитхаба", "у нас 1С микросервисами окружена", "возможностей мало" - частые фразы 1С разработчиков. которым не хватает возможностей платформы в современном мире. Faas, конечно, история не новая, но нас сдерживало 152ФЗ и задержки по пингам. Для того, чтобы действительно использовать в 1С код, к примеру, на Python, надо было приложить усилия. Теперь всё намного проще - берём и используем.

28.12.2020    9429    comol    31    

Базовые вещи БСП, которые облегчат жизнь программисту 1С

БСП (Библиотека стандартных подсистем) Практика программирования v8 1cv8.cf Россия Бесплатно (free)

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

30.08.2020    21762    quazare    34    

Оформление и рефакторинг сложных логических выражений Промо

Практика программирования v8 Россия Бесплатно (free)

В сложных логических выражениях нередко самому автору спустя какое-то время тяжело разобраться, не говоря уже о других программистах. Предлагаемая методика позволяет повысить наглядность таких выражений путем оформления в виде И-ИЛИ дерева и одновременно выполнять их рефакторинг.

20.09.2012    83222    tormozit    131    

Серверные вызовы, которые нельзя вызывать

Практика программирования v8 v8::УФ 1cv8.cf Бесплатно (free)

Не баян, а классика. Рассмотрим особенность платформы настолько же древнюю, как сами УФ.

12.05.2020    9861    SeiOkami    34    

Форма выбора (подбор) в управляемых формах

Практика программирования v8 v8::УФ 1cv8.cf Россия Бесплатно (free)

Разбор небольших примеров того, как правильно открывать форму выбора (подбора) в управляемых формах, не прибегая к модальным окнам.

08.05.2020    89308    user5300    28    

Конвертация расширения cfe в конфигурацию сf руками

Практика программирования v8 1cv8.cf Бесплатно (free)

Как быстро преобразовать расширение в конфигурацию (для дальнейшего переноса в основную конфигурацию, например).

18.03.2020    11648    wtlz    35    

Запись значения в поле ввода/формы со срабатыванием события ПриИзменении Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Иногда возникает необходимость после записи значения в какое либо поле ввода/формы вызвать для него обработчик события ПриИзменении, а о вызове самого события приходится только мечтать. В этой статье приводится программный способ вызова этого события.

11.07.2007    55166    tormozit    51    

Эволюция расширения конфигурации

Практика программирования v8 1cv8.cf Бесплатно (free)

С каждым днем всё больше возможностей появляется в расширении конфигурации, но не все до сих пор работают даже на платформе 8.3.6! Давайте окунемся в историю появления и эволюции расширения конфигурации, чтобы знать и понимать, когда можно применить тот или иной функционал!

06.02.2020    16408    Xershi    47    

Программная работа с настройками СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Нюансы программной работы с настройками системы компоновки данных в отчетах и динамических списках. Обзор всех видов настроек компоновки. Что в каких случаях правильно применять. В качестве примера рассмотрена работа с отборами и группировками.

27.01.2020    70560    ids79    27    

[СКД] Программное создание схемы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Сделаем отчет на СКД полностью программно, без использования макета "схема компоновки данных".

15.01.2020    45994    John_d    22    

Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Как сделать метод формы, доступный на клиенте и на сервере одновременно, и сохранить при этом удобство разработки

10.09.2017    51941    tormozit    74    

Последовательности событий при проведении документа 1С. Шпаргалка + про формы + про расширения

Практика программирования v8 Россия Бесплатно (free)

Собрал информацию о событиях/подписках/расширениях в одном месте.

30.12.2019    37938    kuzyara    38    

Мониторим производительность с помощью 1С RAS

Практика программирования v8 1cv8.cf Бесплатно (free)

Подключаемся и анализируем данные через 1С RAS. Необходимо выполнить 5 пунктов и серьезный инструмент мониторинга будет у вас в руках.

19.12.2019    15918    ivanov660    51    

30 задач. Странных и не очень

Практика программирования v8 Бесплатно (free)

30 задач на знание языка программирования 1С и некоторого поведения платформы. Маленьких. Странных и не очень.

02.12.2019    25766    YPermitin    63    

Выгрузка документа по условию Промо

Практика программирования v8 Бесплатно (free)

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

25.04.2019    18181    m-rv    3    

Обновление релиза измененной типовой конфигурации

Практика программирования v8 1cv8.cf Бесплатно (free)

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

29.11.2019    16012    John_d    76    

Как передать IP адрес, который вызвал HTTP запрос в 1C (для веб-сервера Apache)

Практика программирования v8 Бесплатно (free)

Столкнулся с задачей получения IP адреса, который вызывает http сервис 1С. Итак, решение:

22.11.2019    13228    Sibars    19    

Шпаргалка (БСП). Добавление в новый документ механизма печати дополнительных печатных форм

Практика программирования v8 1cv8.cf Бесплатно (free)

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

10.10.2019    32718    John_d    21    

Как прикрутить ГУИД к регистру сведений Промо

Практика программирования v8 Бесплатно (free)

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

16.04.2019    23617    m-rv    18    

Таблица значений. Нюансы

Практика программирования v8 Бесплатно (free)

Обзор некоторых аспектов использования общеизвестного инструмента 1С.

01.10.2019    55591    Yashazz    56    

[Шпаргалка] Программное создание элементов формы

Работа с интерфейсом Практика программирования v8 1cv8.cf Бесплатно (free)

Программное создание практически всех популярных элементов формы.

06.09.2019    111360    rpgshnik    77    

Агрегатные функции СКД, о которых мало кто знает

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    81993    ids79    56    

Как сделать запрос на изменение данных Промо

Практика программирования v8 v8::Запросы 1cv8.cf Бесплатно (free)

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    37874    m-rv    23    

Регистры бухгалтерии. Общая информация

Математика и алгоритмы Практика программирования v8 v8::БУ БУ Бесплатно (free)

Общая информация о внутреннем устройстве регистров бухгалтерии.

05.09.2019    48916    YPermitin    27    

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

Практика программирования v8 Бесплатно (free)

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

03.09.2019    30648    YPermitin    81    

Отслеживание выполнения фонового задания

Практика программирования v8 1cv8.cf Бесплатно (free)

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

17.08.2019    46634    ids79    22    

Метод формирования движений в типовых регистрах нетиповыми регистраторами Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

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

05.12.2017    30971    itriot11    34    

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    162390    ids79    77    

Фоновое выполнение кода в 1С - это просто

Практика программирования v8 1cv8.cf Бесплатно (free)

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

02.08.2019    64155    avalakh    27    

Разбираемся с параметрами редактирования СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Связь по типу, Параметры выбора, Связи параметров выбора

31.07.2019    44604    json    17    

Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С Промо

Математика и алгоритмы Практика программирования v8 v8::blocking 1cv8.cf Бесплатно (free)

Основные принципы работы с режимами автоматических и управляемых блокировок в 1С Предприятие 8. Теория и применение в типовых конфигурациях: БП, УТ, ЕРП

10.11.2018    46193    ids79    46    

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    111778    ids79    18    

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ

Практика программирования v8 v8::СКД Бесплатно (free)

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    50152    ids79    27    

Регистры сведений. За кулисами

Практика программирования v8 1cv8.cf Бесплатно (free)

Небольшие заметки по внутреннему устройству регистров сведений.

09.07.2019    35056    YPermitin    15    

"Меньше копипаста!", или как Вася универсальную процедуру писал

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    22843    SeiOkami    53    

Работа с настройками системы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Варианты отчетов, работа с настройками вариантов: структура группировок, поля отчета, отборы, сортировка, условное оформление, другие настройки, настройки отображения диаграмм.

02.07.2019    88685    ids79    18    

Регистры накопления. Виртуальные таблицы. Часть №2: "Остатки" и "Остатки и обороты"

Практика программирования v8 1cv8.cf Бесплатно (free)

Описание работы платформы 1С:Предприятие 8.2 с виртуальными таблицами регистров накопления "Остатки" и "Остатки и обороты". Анализ SQL-запрос при работе с виртуальными таблицами

22.05.2019    47233    YPermitin    9    

1Script.Web. Интернет-приложения на языке 1С

Практика программирования v8 Бесплатно (free)

Запросы рынка таковы, что любое современное клиент-серверное приложение должно иметь веб-интерфейс. Почему бы не писать такие приложения на языке 1С? Андрей Овсянкин расскажет о возможностях разработки веб-приложений на базе 1Script, рассмотрит перспективы этого направления и в качестве демонстрации покажет «боевое» веб-приложение на новом движке – кроссплатформенную консоль администрирования парка кластеров 1С.

20.05.2019    22654    Evil Beaver    33    

Регистры накопления. Структура хранения в базе данных

Практика программирования v8 1cv8.cf Бесплатно (free)

Структура хранения регистров накопления в базе данных для платформы 1С:Предприятие 8.x. Первая часть в серии публикаций.

16.05.2019    66921    YPermitin    31