Многопоточность

Публикация № 1211860

Администрирование - Производительность и оптимизация (HighLoad)

Увеличиваем скорость загрузки данных в 20 раз. Как следует использовать многопоточность и готовый модуль для внедрения.

Добрый день, коллеги.

Небольшая статейка и готовое решение для внедрения в свою конфигурацию.

Введение

Вот, сколько я проработал и не разу всерьез не задумывался о многопоточности, пока не начал работу над проектом "Классификатор адресов Украины". При работе в рамках этого проекта столкнулся с необходимость загрузки большого объема данных в конфигурацию, а точнее - необходимо было создать множество элементов в разных справочниках, счет шел на 10-ки а то и 100-ни тысяч элементов...

И как бы меня стало очень сильно "напрягать" продолжительная загрузка данных в рамках тестирования. Ну, что же теперь? Решил поискать в "интернетах", и к сожалению, нашел только старые статьи(но по большому счету ничего с тех времен не изменилось). Да и готового, качественного решения не нашел, пришлось писать самому. И к моему удивлению, скорость загрузки я смог увеличить в 20 раз, благодаря элементарному коду... Какой же глупый я был)

НО ускорения в 20 раз я добился только на сервере, на своей печатной машинке, ускорение было всего 2 раза, при использовании 2 потоков, использовать больше не рекомендую, т.к. особого эффекта от этого не будет. Результат тестов прилагаю.

Ну, как говорится, "погнали".

Внедрение

1. Создаем общий модуль(серверный), называем его "Многопоточность".

2. Копируем в него ниже изложенный код:


#Область ПрограммныйИнтерфейс

// Запускается выполнение указанной процедуры в много поточном режиме 
//
// Параметры:
//  ИмяПроцедуры - Строка - имя экспортной процедуры общего модуля или модуля менеджера объекта, 
//                          которую необходимо выполнить в фоне (ЭкспортнаяПроцедура).
//                          Например, "МойОбщийМодуль.МояПроцедура", "Документы.МойДокумент.МояПроцедура".
//                          У процедуры должен быть один формальный параметр:
//                          * ПараметрыЭкспортнойПроцедуры - Произвольный - произвольные параметры ПараметрыЭкспортнойПроцедуры;
//  СписокДанных - Массив - массив данных, которые будут разделены на части и переданы процедуру,
//                          которая указа в параметре "ИмяПроцедуры".
//  КоличествоПотоков - Число - количество потоков на которое необходимо разделить обработку СпискаДанных,
//                              значение по умолчанию равно 2.
//  Ожидание - Булево - признак указывающий на необходимость ожидания выполнения всех фоновых заданий,
//                      Истина - ожидать пока выполнятся все задания и потом возвращать управление в вызываемый код,
//                      Ложь - возвращать управление в вызываемый код сразу после создания всех заданий.
//
// Возвращаемое значение:
//  <Отсутствует> - 
//
// Варианты вызова:
//  Запустить(ИмяПроцедуры, СписокДанных) - 
//
Функция Запустить(Знач ИмяПроцедуры, Знач СписокДанных, Знач КоличествоПотоков = Неопределено, Знач Ожидание = Истина) Экспорт

	// Отладка.
	//ИмяПроцедуры = "";
	//СписокДанных = Новый Массив;
	
	// Расчеты основных параметров для распределения потоков.
	КоличествоДанных = СписокДанных.Количество();
	КоличествоПотоков = РассчитатьКоличествоПотоков(КоличествоДанных, КоличествоПотоков);
	РазмерПорции = РассчитатьРазмерПорции(КоличествоДанных, КоличествоПотоков);
	
	//
	СписокФоновыхЗаданий = Новый Массив;
	
	// Создание порций данных и запуск выполнения в фоне "ЭкспортнаяПроцедура".
	Данные = Новый Массив;
	Для Каждого Элемент Из СписокДанных Цикл
		
		// Добавление данных в порцию.
		Данные.Добавить(Элемент);
		
		// Проверка размера порции и при достижении рассчитаного размера,
		// запуск выполнения в фоне "ЭкспортнаяПроцедура".
		Если Данные.Количество() = РазмерПорции Тогда
			ЗапуститьВФоне(ИмяПроцедуры, Данные, СписокФоновыхЗаданий);	
		КонецЕсли;
		
	КонецЦикла;

	// Проверка остатка данных,
	// при необходимости выполнение "ЭкспортнаяПроцедура" с остатком данных,
	// количество которых меньше рассчитаного размера порции.
	Если Данные.Количество() > 0 Тогда
		ЗапуститьВФоне(ИмяПроцедуры, Данные, СписокФоновыхЗаданий);		
	КонецЕсли;
	
	// Ожидание при необходимости и задержка передачи управления в вызываемый код.
	Если Ожидание Тогда
		ФоновыеЗадания.ОжидатьЗавершенияВыполнения(СписокФоновыхЗаданий);
	КонецЕсли;
	
КонецФункции // Запустить()

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

#Область СлужебныйПрограммныйИнтерфейс

Функция ЗапуститьВФоне(ИмяПроцедуры, СписокДанных, СписокФоновыхЗаданий)
	
	Параметры = Новый Массив;
	Параметры.Добавить(СписокДанных);

	СписокФоновыхЗаданий.Добавить(
		ФоновыеЗадания.Выполнить(ИмяПроцедуры, Параметры));

	СписокДанных.Очистить();
	
КонецФункции // ЗапуститьВФоне()

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

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

Функция РассчитатьРазмерПорции(КоличествоДанных, КоличествоПотоков)

	Возврат Цел(КоличествоДанных / КоличествоПотоков);
	
КонецФункции // РассчитатьРазмерПорции()

Функция РассчитатьКоличествоПотоков(КоличествоДанных, КоличествоПотоков)

	Возврат ?(КоличествоПотоков <> Неопределено, КоличествоПотоков, 2)
	
КонецФункции // РассчитатьКоличествоПотоков()

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

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

3. Начинаем наслаждаться и использовать.

 

Использование

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

Пример вызова:

Многопоточность.Запустить("КлассификаторАдресовУкраины.ЗагрузитьРайоныКОАТУУ", СписокРайонов, 10);

где:

  • КлассификаторАдресовУкраины - это общий модуль(серверный)
  • ЗагрузитьРайоныКОАТУУ - это экспортная процедура модуля КлассификаторАдресовУкраины
  • СписокРайонов - массив данных, а в массиве у меня лично элементы с типом - Структура
  • 10 - количество потоков.

Пример реализации процедуры, которою будем вызывать:

Процедура ЗагрузитьРегионыКОАТУУ(СписокДанных) Экспорт
	
	Для Каждого Элемент Из СписокДанных Цикл
		
		// траляля
		
	КонецЦикла;	    

КонецПроцедуры // ЗагрузитьРегионыКОАТУУ

В этой процедуре в параметр попадает часть(кусок) данных из тех данных которые мы передали в функцию Многопоточность.Запустить()

 

Заключение

Вот собственно и все, надеюсь, все доступно объяснил, у кого есть предложения по улучшению - предлагайте. Буду рад!)

З.Ы. Использую функции, а не процедуры, т.к. планирую что-то доработать, а что, еще не придумал)))

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

Комментарии
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
1. tech_supp19 18.03.20 08:32 Сейчас в теме
А почему не использовали готовые модули "Длительные операции" из БСП?
portwein; potoyalo; mvxyz; Evg-Lylyk; lk255; +5 Ответить
2. kaliuzhnyi 18.03.20 09:41 Сейчас в теме
(1)
Я там не увидел многопоточности. А вы видели?
3. tech_supp19 18.03.20 09:58 Сейчас в теме
(2) Конечно. Так же как и в этой публикации я вижу фоновые задания, как бы Вы их не назвали.
portwein; lk255; +2 Ответить
6. kaliuzhnyi 18.03.20 10:19 Сейчас в теме
(3)
Ну если вы не видите разницы между одним фоновым заданием и двумя фоновыми заданиями которые выполняются параллельно. То мне сложно что-то объяснить.
И да, вы можете использовать ДлительныеОперации, только перед этим не забудьте разбить ваши данные на части.
user1035175; +1 1 Ответить
10. tech_supp19 18.03.20 10:45 Сейчас в теме
(6) Мне ничего не мешает запускать несколько операций с разными параметрами.
11. kaliuzhnyi 18.03.20 10:57 Сейчас в теме
(10) Так никто-же не заставляет использовать...
Только тогда вам все эти циклы и разбития данных на части необходимо писать в своей форме и/или модуле, и тогда ваш код превратится в свалку, а чтобы не было свалки нужно создать отдельный модуль(о чем и написано в статье) и в этом модуле прописать практически все то-же что и у меня выложено...
А когда вам необходимо будет загрузить подряд 5 справочников(область, район, город, улица, дом) и при этом именно ПОДРЯД, т.к. каждый справочник подченен другому... Я бы посмотрел на ваш код где подряд 5 массив с разбиением данных и 10 раз запуск Длительных операций, тогда ваш код станет просто непригодным к использованию.
К тому же не стоит забывать о разных конфигурациях, где код загажен до такой степи, что плакать хочется, в том числе есть конфигурации где некоторые умники полезли править типовые механизмы, также есть самописные, и если вам приходится приходится работать только с типовыми и не "правленными" конфигурациями то вам повезло очень сильно.
А этот модуль рассчитан на то, чтобы его закинуть в любую конфигурацию, и работать сразу.
frkbvfnjh; Fox-trot; +2 Ответить
13. VmvLer 18.03.20 11:03 Сейчас в теме
(11) "О боже, как же я прекрасен")
o.nikolaev; user1371486; Lyolik; tech_supp19; +4 Ответить
14. kaliuzhnyi 18.03.20 11:32 Сейчас в теме
(13) Наверное по с равнению с вами да... Мне случайно не с вашим кодом приходится работать который написан задним местом?
16. VmvLer 18.03.20 11:36 Сейчас в теме
(14) вы всегда переходите на личности когда сталкиваетесь с критикой или вас просто плохо учили вести диалог?)
Lyolik; CyberCerber; +2 Ответить
24. kaliuzhnyi 18.03.20 13:03 Сейчас в теме
(16) Так вы же первый перешли на личности...
izidakg; user843241; the1; +3 Ответить
26. kaliuzhnyi 18.03.20 13:04 Сейчас в теме
(16) Я всего лишь пытался донести практическую пользу от выложенного модуля.
41. tech_supp19 23.03.20 09:59 Сейчас в теме
(11)
Только тогда вам все эти циклы и разбития данных на части необходимо писать в своей форме


Логичнее это вынести в отдельный модуль - обертку над длительными операциями (которые есть во всех актуальных конфигурациях). В котором будет разбивка параметров и запуск необходимого числа фоновых заданий.
4. Eskimos 26 18.03.20 10:05 Сейчас в теме
Вот этот массив:
Данные = Новый Массив;

Я бы очищал после каждого вызова:
 ЗапуститьВФоне(ИмяПроцедуры, Данные, СписокФоновыхЗаданий);
pm74; vano-ekt; kaliuzhnyi; +3 Ответить
7. kaliuzhnyi 18.03.20 10:21 Сейчас в теме
37. riposte 296 21.03.20 07:32 Сейчас в теме
Автор, конечно, тот еще молодец, но,
не стоит забывать о разных конфигурациях, где код загажен до такой степи, что плакать хочется, в том числе есть конфигурации где некоторые умники полезли править типовые механизмы
...
А этот модуль рассчитан на то, чтобы его закинуть в любую конфигурацию, и работать сразу.

Хорошо, давай посмотрим.
	КоличествоДанных = СписокДанных.Количество();
	КоличествоПотоков = РассчитатьКоличествоПотоков(КоличествоДанных, КоличествоПотоков);
	РазмерПорции = Цел(КоличествоДанных / КоличествоПотоков);

	Данные = Новый Массив;
	Для Каждого Элемент Из СписокДанных Цикл
		
		// Добавление данных в порцию.
		Данные.Добавить(Элемент);
		
		// Проверка размера порции и при достижении рассчитаного размера,
		// запуск выполнения в фоне "ЭкспортнаяПроцедура".
		Если Данные.Количество() = РазмерПорции Тогда
			ЗапуститьВФоне(ИмяПроцедуры, Данные, СписокФоновыхЗаданий);
	                Данные = Новый Массив; // Забыли очистить данные? Или очищаем в ЗапуститьВФоне?
		КонецЕсли;
		
	КонецЦикла;
Показать

А что делать с остатком деления?

P.S. Если исполняемый код обхода массива был таким, как в публикации, при замере времени выполнения, а Данные не очищались - прирост "в 20 раз" как бы становится понятен. Было обработана 1\20 часть данных, потому и в 20 раз быстрее :3
Прикрепленные файлы:
ВнешняяОбработка1.epf
38. kaliuzhnyi 21.03.20 20:05 Сейчас в теме
(37)
А что делать с остатком деления?

Смотрите внимательнее!
40. riposte 296 21.03.20 20:40 Сейчас в теме
39. kaliuzhnyi 21.03.20 20:07 Сейчас в теме
(37)
// Забыли очистить данные? Или очищаем в ЗапуститьВФоне?

Еще раз посмотрите внимательнее!
5. vano-ekt 730 18.03.20 10:19 Сейчас в теме
8. kaliuzhnyi 18.03.20 10:26 Сейчас в теме
(5) Принцип тот же. Но в той статье нужно думать)) и подгонять под себя. А я выложил просто готовый модуль который готов к использованию.
9. RocKeR_13 797 18.03.20 10:32 Сейчас в теме
(8)
Но в той статье нужно думать))

Напомнило недавнюю фразу кандидата на должность стажера
А что, тут еще книжки нужно читать?
12. VmvLer 18.03.20 11:00 Сейчас в теме
велик конеш.
да и для таких задач как классификаторы где данные можно четко разделить на порции иногда
проще запустить несколько сеансов чем связываться с капризами фоновых, которые падают как
дебютантки на балах поле первого бокала.

многопоточность в учетных задачах 1С, на данный момент, миф.
15. kaliuzhnyi 18.03.20 11:34 Сейчас в теме
(12) А есть другие варианты?)
Ну, миф не миф, а у меня время загрузки сократилась в десятки раз. А главное результат.
&rew; davdykin; +2 Ответить
17. VmvLer 18.03.20 11:40 Сейчас в теме
(15) Расчеты себестоимости в УТ, ЕРП и прочие "окабаневшие" процессы запускают десятки фоновых якобы в целях многопочтности, а толку?

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

не вижу смысла далее вести диалог, вы правы в своих заблуждениях)
18. dinopopyys 120 18.03.20 12:33 Сейчас в теме
ну в целом да, своего рода многопоточность. Автор молодец.
Другое дело зачем она в 1с? - очень мало применения.
kaliuzhnyi; +1 2 Ответить
21. Nikola23 511 18.03.20 12:54 Сейчас в теме
(18)
Загрузка данных из внешних источников
Обработка запросов веб-сервера
Постобработка данных
Удаление помеченных объектов
Закрытие месяца. В последних версиях платформы решение систем линейных уравнение сделали многопоточным (или обещали сделать)
Проведение по регистрам, если они не связаны особой бизнес-логикой

Комментаторы, дополнят список
19. user1371486 18.03.20 12:43 Сейчас в теме
Читая такие статьи, все больше убеждаюсь, что ИС окончательно скатывается в помойку. Скоро найти нормальную инфу будет не реально. остались статьи о жизни, проектном управлении, да вот такие вот шедевры. Скоро начнутся статьи, как один массив разделить на несколько.
user1311038; azhilichev; vladimirmatancev; CyberCerber; Evg-Lylyk; DarkAn; +6 4 Ответить
29. kaliuzhnyi 18.03.20 13:14 Сейчас в теме
(19)
А вы много знаете способов разделить массив на несколько? А какой будет эффективнее?
32. user1371486 18.03.20 15:06 Сейчас в теме
(29) Вам, голубчик, уже и без того в комментах напихали. Ибо оптимальный способ разделения массива на части Вы, увы, не осилите.
33. kaliuzhnyi 18.03.20 21:47 Сейчас в теме
(29) Из-за таких как вы голубчик, потом страдают заказчики...
И потом приходится переделывать ваш г*но код приходится, где разделение массива происходит через задний проход.
36. user1371486 19.03.20 09:27 Сейчас в теме
(33) Переход на личности засчитан.
Далее. Мои заказчики страдают? А вдруг я работаю госпожой в БДСМ-салоне, и они приходят ко мне именно пострадать. Через какой проход - не суть важно. Я же не публикую это на ИС: смотрите, как ускоряется код после N ударов плеткой программисту.

P.S.
В следующий раз правильно выбирайте номер поста в ответ. А то ведь оно заразно - сегодня номер поста не тот, завтра не ту переменную на вход в функцию подсунете.
AlexeyPapanov; user1311038; +2 Ответить
20. buganov 150 18.03.20 12:53 Сейчас в теме
Вот же о многопоточности в 1С. Отлично расписано.И я бы даже сказал, что данная статья просто повторяет статью Бурмистрова.
https:// /articles/как-ускорить-1с-многопоточность/
22. Nikola23 511 18.03.20 12:58 Сейчас в теме
(20) ссылка не работает.

Репосты и ремиксы - это наша реальность.

Ничего страшного, если автор переоформит повторно ранее написанное.
Кто-то поймет по его описанию, кто-то поймет тему по статье 7ми летней давности.

Ну а нытики с комментариями "раньше было лучше" всегда есть, были и будут.

Даже Аристотель в своих писал "молодежь уже не та".
25. buganov 150 18.03.20 13:04 Сейчас в теме
(22) да не ною я. Репосты и ремиксы ценны тем, что дополняют оригинальную статью, а не просто копипастят.
Вот ссылка.
https://xn----1-bedvffifm4g.xn--p1ai/articles/%D0%BA%D0%B0%D0%BA-%D1%83%D1%81%D0%BA%D0%BE%D1%80%D0%B8%D1%82%D1%8C-1%D1%81-%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BF%D0%BE%D1%82%D0%BE%D1%87­%D0%BD%D0%BE%D1%81%D1%82%D1%8C/
28. kaliuzhnyi 18.03.20 13:12 Сейчас в теме
(25) кстати эту статью я не нашел, наверное плохо искал.
Ремиксы и репосты полностью с вами согласен. Кто-то поймет другою статью а кто-то эту.
У меня так часть бывает... Даже код может быть одинаковый но автор мне объяснил по другому и я сразу понял что к чему...
23. buganov 150 18.03.20 13:02 Сейчас в теме
Кстати, странно, что при двух потоках аж в 20 раз увеличилась скорость. Откуда такой прирост, если данные дробятся "как бог на душу положит" или перед передачей в процедуру Вы уже разбиваете? Если готовые данные передаете, то тем более не вижу смысла дробить еще раз.
Поясню. Допустим, у нас есть таблица данных из, скажем из миллиона строк, которые нужно впихнуть быстро в, например, регистр сведений.
Эта таблица отлично бьется в разрезе каких-то полей, например, по полю Склад. Пусть складов в таблице 10, значит будет 10 потоков, больше не стоит, можно сильно нагрузить сервера. И это был бы наиболее верный алгоритм.
В связи с этим, правильней, я считаю, оставлять дробление данных на руки разработчика, который просто передаст в длительную операцию запись, а потом просто подождет завершения всех потоков
27. kaliuzhnyi 18.03.20 13:08 Сейчас в теме
(23) На сервере скорость увеличилась примерно в раза, если использовать 2 потока. На картинках посмотрите. Время указано в секундах. В двадцать раз скорость загрузки увеличилась когда я "жахнул" 20 потоков)))
31. DarkAn 937 18.03.20 14:33 Сейчас в теме
(0) уж не знаю как Вы искали информацию по многопоточности, но на том же ИС их более, чем достаточно
Ваша реализация, показанная в данной статье, САМАЯ простая. Она не учитывает множество нюансов по работе с потоками.

В далеком 2017 году я уже писал (https://infostart.ru/public/626117/ 52 комментарий)

https://infostart.ru/public/182139/
Это самый простой способ распараллелить, и не самый оптимальный. Его основные минусы:
* Необходимо обдумывать как разбить обрабатываемый массив на части (порции) (В предоставленной статье порция - это склад).
*
ФоновыеЗадания.ОжидатьЗавершения(МассивЗаданий);
тут узкое место в том, что пока ПАЧКА фоновых заданий не отработает полностью новое не запуститься. Если в первую выборку попадет один гигантский склад и 9 маленьких, но при этом в общей выборке их предположи 11, то последний 11 склад будет ждать завершения всего блока, ходя 9 потоков по сути будут давно свободны.
* Не реализована обратная связь между потоками и клиентом, хотя допил не большой,
* И САМОЕ ГЛАВНОЕ, если в потоке произойдет ЛЮБАЯ ошибка, хоть ожидание захвата таблицы, он просто прекратит свою жизнь, и Вам ни как об этом не сообщит


Ваше решение имеет еще ряд недоработок, в частности:
* я скажу что мне надо 5 потоков, а будет запущено 6, т.к. в 6 попадет "хвост" данных
* а что будет если размер порции будет < 1?
* а есть ли смысл запускать в потоках если данных в подаваемой выборке мало?
* и т.д.

Если Вам будет интересно, можете ознакомиться с моей публикацией на тему многопоточности (https://infostart.ru/public/778905/), возможно найдете идеи для своего проекта.
vladimirmatancev; user1371486; dime2; kaliuzhnyi; kiruha; +5 Ответить
34. kaliuzhnyi 18.03.20 22:03 Сейчас в теме
(31)
я скажу что мне надо 5 потоков, а будет запущено 6, т.к. в 6 попадет "хвост" данных

спасибо, исправлю.
а что будет если размер порции будет < 1?

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

а тут уже решает разработчик который запускает эту процедуру.

вашу статью обязательно прочту, она на первый взгляд хорошо изложена)

но допустим статья которую вы привели - https://infostart.ru/public/626117/ , довольно сложная в понимании, к таким статьям необходимо переходить после того будут понятны элементарные вещи, которые собственно я и описал...
30. frkbvfnjh 582 18.03.20 14:32 Сейчас в теме
З.Ы. Использую функции, а не процедуры, т.к. планирую что-то доработать, а что, еще не придумал)))

На мой взгляд, процедуры вообще зло, все должно быть функциями, пусть даже они будут возвращать "Неопределено", в частности боль начинается когда не можешь выполнить процедуру во время отладки, просто потому, что она процедура.
CyberCerber; +1 Ответить
42. AlX0id 30.03.20 08:12 Сейчас в теме
(30)
И более того - каждая функция должна возвращать информацию об успешности/неуспешности выполнения )
Ну это как по мне.
35. _ASZ_ 99 19.03.20 08:05 Сейчас в теме
Простой код, решение задачи "в лоб"...
А если один или несколько из потоков будут завершены аварийно или "убиты" на кластере? Удобно ли отлаживать код, обернутый в такие конструкции? Есть и более зрелые решения.
Evg-Lylyk; dsdred; user1371486; +3 Ответить
43. user612295_death4321 05.04.20 09:23 Сейчас в теме
Если продумать на перед, что выполняемые фоновые порции не попадут на конкурентную запись (не просядет железка, не будет блокировок 1С или СУБД), то это вполне рабочий вариант с ускорением выполнения операций.

Подобным способом увеличили скорость проведения документов реализации, прирост в скорости проведения получился в ускорении в 4-5 раз, по сравнению с последовательным проведением документов по 1му, и теперь склад не при каких обстоятельствах не готов возвращаться к старому механизму. Правда УППшечку пришлось перед этим очень плотно готовить, переписать механизм допроведения документов + перевести базу в RCSI, выпилить весь говнокод с обращениями через точку к полям ссылочного типа и все, вуаля, все счастливы.
Оставьте свое сообщение

См. также

3 онлайн-курса по 1С-программированию: обмен данными, расчетные задачи и бухгалтерские задачи с 12 мая по 8 июля 2020 г. Промо

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

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

22.04.2020    4631    23    Infostart    2    

Эти занимательные временные таблицы

Производительность и оптимизация (HighLoad) Администрирование СУБД v8 Бесплатно (free)

Кое-что интересное о временных таблицах и работе платформы 1С с ними.

06.04.2020    10035    0    YPermitin    0    

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

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

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

27.01.2020    19155    0    ids79    26    

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

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

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

15.01.2020    18524    0    John_d    22    

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

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

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

10.12.2016    35505    0    unichkin    45    

Последовательности событий. Шпаргалка

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

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

30.12.2019    13461    0    kuzyara    33    

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

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

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

22.11.2019    6808    0    Sibars    19    

Обслуживание баз данных. Не так просто, как кажется

Производительность и оптимизация (HighLoad) Администрирование СУБД v8 1cv8.cf Бесплатно (free)

Считаете, что обслуживание индексов и статистик дело простое? Что ж, это не всегда так.

14.10.2019    16377    0    YPermitin    28    

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

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

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

15.10.2018    27940    0    tormozit    100    

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

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

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

01.10.2019    28220    0    Yashazz    45    

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

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

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

06.09.2019    39755    0    rpgshnik    62    

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

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

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

05.09.2019    41889    0    ids79    54    

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

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

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

20.09.2012    75423    0    tormozit    129    

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

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

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

05.09.2019    24429    0    YPermitin    24    

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

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

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

03.09.2019    23143    0    YPermitin    80    

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

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

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

17.08.2019    28290    0    ids79    16    

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

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

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

11.07.2007    46321    0    tormozit    38    

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

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

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

08.08.2019    65317    0    ids79    40    

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

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

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

02.08.2019    29322    0    avalakh    22    

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

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

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

26.07.2019    48935    0    ids79    11    

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

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

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

10.09.2017    42346    0    tormozit    74    

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

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

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

17.07.2019    31518    0    ids79    27    

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

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

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

09.07.2019    23818    0    YPermitin    13    

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

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

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

04.07.2019    17709    0    SeiOkami    50    

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

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

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

25.04.2019    15409    0    m-rv    2    

Создание отчетов с помощью СКД - основные понятия и элементы

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

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    46001    0    ids79    25    

Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017

Практика программирования Производительность и оптимизация (HighLoad) v8 v8::Запросы Бесплатно (free)

Взаимодействие с Microsoft SQL Server нередко вызывает трудности у 1С-ников, а потому интересны любые моменты, связанные с его использованием. О своем опыте работы с новым SQL Server 2017 участникам конференции Infostart-2018 рассказал директор ООО «Аналитика софт» Дмитрий Дудин.

11.06.2019    22833    0    dmurk    144    

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

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

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

16.05.2019    38433    0    YPermitin    30    

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

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

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

16.04.2019    19177    0    m-rv    17    

Выполнение внешней обработки в фоновом задании

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

Подробное описание подхода к созданию длительной операции на основе внешней обработки. Реализация протестирована на 1С 8.3.12.1714 (x64).

11.05.2019    26599    0    Eret1k    23    

5 простых шагов и 15 минут на разворачивание инструмента мониторинга проблем производительности базы 1С

Производительность и оптимизация (HighLoad) v8 Бесплатно (free)

В этой статье мы разберем механизм использования конфигурации "Анализ технологического журнала" на практике, и всего через 15 минут работы вы получите функциональный, удобный инструмент мониторинга проблем производительности базы 1С.

18.04.2019    27743    0    ivanov660    77    

О расширениях замолвите слово...

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

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    32073    0    ellavs    126    

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

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

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

01.06.2018    28826    0    m-rv    21    

Git-репозитории для 1С-кода (опыт использования при небольших проектах)

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

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

28.03.2019    25283    0    ellavs    88    

Трюки с внешними источниками данных

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

Некоторые трюки для преодоления ограничений внешних источников данных.

14.03.2019    28883    0    YPermitin    53    

Возможности типовых шаблонов ограничения доступа на уровне записей (RLS)

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

Краткий обзор применения типовых шаблонов ограничения доступа на уровне записей в конфигурациях, созданных на базе БСП: #ПоЗначениям, #ПоНаборамЗначений, #ПоЗначениямРасширенный, #ПоЗначениямИНаборамРасширенный

03.02.2019    34625    0    ids79    9    

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

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

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

05.12.2017    26864    0    itriot11    34    

Новый подход к обмену данными EnterpriseData

Практика программирования Обмен через XML v8 v8::УФ Россия Бесплатно (free)

Хочу предложить Вашему вниманию цикл статей, посвященных обмену данными через универсальный формат (EnterpriseData или ED).

14.12.2018    37861    0    ids79    72    

EnterpriseData - пример доработки правил конвертации без использования КД 3.0 в расширении конфигурации

Практика программирования Обмен через XML v8 v8::УФ БП3.0 УТ11 Россия Бесплатно (free)

В статье подробно описан реальный пример доработки обмена данными через EnterpriseData (универсальный формат обмена) между конфигурациями УТ 11.4 и Бухгалтерия 3.0

16.11.2018    34269    0    ids79    40    

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

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

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

27.01.2016    73427    0    Serginio    108    

Программное заполнение пользовательских параметров и отборов СКД

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

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

13.11.2018    41378    0    Unk92    21    

Новый режим реструктуризации (обновление базы данных на сервере в режиме v2)

Производительность и оптимизация (HighLoad) v8 1cv8.cf Бесплатно (free)

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

31.10.2018    26922    0    Dach    49    

Произвольный код в фоновом режиме

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

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

03.09.2018    25692    0    nikita0832    42    

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

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

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

10.11.2018    32421    0    ids79    40    

Основные понятия и механизмы оптимизации клиент-серверного взаимодействия в 1C

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

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

23.08.2018    36461    0    Rain88    46    

Тестер: частые вопросы Промо

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

Ошибкам бой - тесты норма жизни!

25.07.2018    27536    0    grumagargler    26