Мастер-класс от Poppy (практикум по рефакторингу)

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

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

Попался на глаза код неопытного программиста. Не смогла пройти мимо, захотелось выполнить рефактроинг. Вот что из этого получилось.
В качестве подопытного кода была выбрана статья //infostart.ru/blogs/688/. Не буду обсуждать полезность и нужность рассматриваемого кода, просто переставлю строчки кода так, что бы с ними можно было работать. Смотрим результат:

Функция ОбойтиМетаданные(П, Код)
	//Обходит метаданные, выбирая код отбора...
	ТЗ=СоздатьКолонкиТЗРезультатов();
	
	П.Вставить("ТЗ", ТЗ);
	П.Вставить("Пропустить", ложь); 
	
	Описание=Новый Структура();
	Описание.Вставить("Класс", "Константы");
	Описание.Вставить("Вид", Неопределено);
	Описание.Вставить("ТЧ", Неопределено);
	
	ОбойтиАтрибуты(Метаданные.Константы, "Реквизит", П, Описание, Код);

	СобратьДанныеПоМетаданному(П, Код, "Справочники", 				истина, ложь,   истина);
	СобратьДанныеПоМетаданному(П, Код, "Документы", 				истина, ложь,   истина);
	СобратьДанныеПоМетаданному(П, Код, "ЖурналыДокументов", 		ложь,   ложь,   ложь);
	СобратьДанныеПоМетаданному(П, Код, "Перечисления", 				ложь,   ложь,   ложь);
	СобратьДанныеПоМетаданному(П, Код, "Отчеты", 					истина, ложь,   истина);
	СобратьДанныеПоМетаданному(П, Код, "Обработки", 				истина, ложь,   истина);
	СобратьДанныеПоМетаданному(П, Код, "ПланыВидовХарактеристик", 	истина, ложь,   истина);
	СобратьДанныеПоМетаданному(П, Код, "ПланыСчетов", 				истина, ложь,   истина);
	СобратьДанныеПоМетаданному(П, Код, "ПланыВидовРасчета", 		истина, ложь,   истина);
	СобратьДанныеПоМетаданному(П, Код, "РегистрыСведений", 			истина, истина, ложь);
	СобратьДанныеПоМетаданному(П, Код, "РегистрыНакопления", 		истина, истина, ложь);
	СобратьДанныеПоМетаданному(П, Код, "РегистрыБухгалтерии", 		истина, истина, ложь);
	СобратьДанныеПоМетаданному(П, Код, "РегистрыРасчета", 			истина, истина, ложь);
	СобратьДанныеПоМетаданному(П, Код, "БизнесПроцессы", 			истина, ложь,   истина);
	СобратьДанныеПоМетаданному(П, Код, "Задачи", 					истина, ложь,   истина);
	
	Возврат П;
КонецФункции

Процедура СобратьДанныеПоМетаданному(П, Код, Класс, ЕстьРеквизиты = ложь, ЕстьИзмеренияИРесурсы = ложь, ЕстьТЧ = ложь)
	
	Описание=Новый Структура();
	Описание.Вставить("Класс", Класс);
	Описание.Вставить("Уровень", "Класс");
	ОбойтиМетаданныеСлуж(П, Описание, Код);
	Если П.Пропустить Тогда
		Возврат;
	КонецЕсли;
	
	Для Каждого МДВид ИЗ Метаданные[Класс] Цикл
		Описание.Вставить("Вид", МДВид.Имя);
		Описание.Вставить("ТЧ", Неопределено);
		Описание.Вставить("Уровень", "Вид");
		Описание.Вставить("Синоним", МДВид.Синоним);
		ОбойтиМетаданныеСлуж(П, Описание, Код);
		Если П.Пропустить Тогда
			Продолжить;
		КонецЕсли;
		
		Если ЕстьРеквизиты Тогда
			ОбойтиАтрибуты(МДВид.Реквизиты, "Реквизит", П, Описание, Код);
		КонецЕсли;
		
		Если ЕстьИзмеренияИРесурсы Тогда
			ОбойтиАтрибуты(МДВид.Измерения, "Измерение", П, Описание, Код);
			ОбойтиАтрибуты(МДВид.Ресурсы, "Ресурс", П, Описание, Код);
		КонецЕсли;
		
		Если ЕстьТЧ Тогда
			Для Каждого МД_ТЧ ИЗ МДВид.ТабличныеЧасти Цикл
				Описание.Вставить("ТЧ", МД_ТЧ.Имя);
				ОбойтиАтрибуты(МД_ТЧ.Реквизиты, "Реквизит", П, Описание, Код);
			КонецЦикла;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

Функция СоздатьКолонкиТЗРезультатов()
	ТЗ=Новый ТаблицаЗначений();
	ТЗ.Колонки.Добавить("Класс");
	ТЗ.Колонки.Добавить("Вид");
	ТЗ.Колонки.Добавить("ТЧ");
	ТЗ.Колонки.Добавить("Атрибут");
	ТЗ.Колонки.Добавить("ТипАтрибута");
	ТЗ.Колонки.Добавить("ВидАтрибута");
	ТЗ.Колонки.Добавить("Синоним");
	ТЗ.Колонки.Добавить("Уровень");
	
	Возврат ТЗ;
КонецФункции

Процедура ОбойтиАтрибуты(Атрибуты, ВидАтрибута, П, Описание, Код)
	Для Каждого МДАтрибут ИЗ Атрибуты Цикл
		Описание.Вставить("Уровень", "Атрибут");
		Описание.Вставить("Атрибут", МДАтрибут.Имя);
		Описание.Вставить("Синоним", МДАтрибут.Синоним);
		Описание.Вставить("ТипАтрибута", МДАтрибут.Тип);
		Описание.Вставить("ВидАтрибута", ВидАтрибута);
		ОбойтиМетаданныеСлуж(П, Описание, Код);
	КонецЦикла;
КонецПроцедуры

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


Кроме выполненного рефакторинга, еще и расширена функциональность. Теперь можно получать список не только реквизитов объектов, но и реквизитов табличных частей объектов.
Про рефакторинг написано здесь //infostart.ru/blogs/652/
Рефакторинг выполнен не полностью. Опущен важный метод - Переименование. Так сказать, для сохранения исходной самобытности.

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. 04.11.08 15:10 Сейчас в теме
можно вкратце объяснить суть рефакторинга?
2. Вадимко 209 04.11.08 16:52 Сейчас в теме
Оба кода являются наикрасивейшими образчиками мЫшления!
3. CheBurator 04.11.08 17:13 Сейчас в теме
У Поппы - понятнее.. вот и весь рефакторинг (упрощенно)
4. 04.11.08 17:22 Сейчас в теме
(3) Ну если так понятнее Попе, это его дело. ;-) Я не хотел дробить эту функцию на несколько, т.к. постоянно приходится ее тянуть в разные обработки.
За необоснованное использование тега "неопытный кодер" минусану. ;-)
AlexO; Uscolegy; +2 7 Ответить
5. BabySG 04.11.08 17:39 Сейчас в теме
Совершенно обоснованное мнение по "неопытному кодеру" - повторять н-раз один и тот же код - признак неопытности.
Так что Poppy совершенно права и её код читается намного легче.

А отмазки, типа: "Я не хотел дробить эту функцию на несколько, т.к. постоянно приходится ее тянуть в разные обработки." выглядят вообще смешно.
Зато прикольно будет, наверное, когда прицип обода поменяется и нужно будет изменять код в Н-местах вместо одного.
32. AlexO 130 29.05.12 14:15 Сейчас в теме
(5) BabySG,
Совершенно обоснованное мнение по "неопытному кодеру" - повторять н-раз один и тот же код - признак неопытности.

да неужели? вот откуда во всех типовых - десятки функций, делающих одно и тоже, но реализованные аюсолютно по-разному. Ну, и ошибки в них - разные...
Код идентичный повторять не нужно - делаешь вызов одной и той же фукнции.
А отмазки, типа: "Я не хотел дробить эту функцию на несколько, т.к. постоянно приходится ее тянуть в разные обработки." выглядят вообще смешно.

это почему еще? очень удобно не изобретать велосипед каждый раз (за что тут же, на инфострате, ратуют наверняка те же самые, кто пишет "смешно тянуть код в обработки" :) )
Это минус 1с-у - при такой дезорганизаванности и бессистемности операторов до сих пор нет официального репозитария стандартного кода и функций.
Зато прикольно будет, наверное, когда прицип обода поменяется и нужно будет изменять код в Н-местах вместо одного.

"прикольно" - это когда обработка номера документа в разных документах вызывает разные функции обработки.
6. alexk-is 6499 04.11.08 19:04 Сейчас в теме
Рефакторинг - это не только перестановка строк местами и вынос повторов в процедуры и функции...
Стало "понятнее" - ну, не намного. Код по-прежнему не читается с листа. Переменные, процедуры и функции не говорят сами за себя. "СоздатьМДКласс" - на самом деле создает массив с обрабатываемыми видами объектов метаданных. И так почти по каждой строке... (без бутылки не разберешься :) ).
А вот что медленнее работать будет это точно. :(
И не всегда минимум кода это хорошо.

Например:
Вариант 1
Код
Массив = Новый Массив(7);
Массив[0] = 1;
Массив[1] = 2;
Массив[2] = 3;
Массив[3] = 4;
Массив[4] = 5;
Массив[5] = 6;
Массив[6] = 7;
Показать полностью

Вариант 2
Код
Массив = Новый Массив(7);
Для Индекс = 0 По 6 Цикл
    Массив[Индекс] = Индекс + 1;
КонецЦикла;
Показать полностью

Сравним:
Вариант 1 - 8 строк кода
Вариант 2 - 4 строки кода
Вариант 1 - 8 команд при выполнении
Вариант 2 - 26 команд при выполнении
Кроме этого вариант 2 работает в 6-10 раз медленее...

Обратите внимание на 175 пост http://infostart.ru/blogs/652/ кратко и по существу...
mailwood; igor_gk; +2 Ответить
7. Vitek 05.11.08 08:49 Сейчас в теме
2 alexk-is
Вариант 1 - 8 команд при выполнении
Вариант 2 - 26 команд при выполнении
Кроме этого вариант 2 работает в 6-10 раз медленее...

Я все понимаю, но это ж не ассемблер :)
"Медленнее" в данном случае весьма условно.
К тому же, а если бы массив содержал 100 элементов?
9. Altair777 643 05.11.08 10:12 Сейчас в теме
(7) > К тому же, а если бы массив содержал 100 элементов?
Мне кажется, что на практике очень редко массивы заполняются значениями по простым формулам, зависящим от индекса элемента
И, опять же - рефакторинг - это не догма, а средство )
8. quest 05.11.08 10:04 Сейчас в теме
ИМХО, рефакторинг требует юниттестирования. что бы быть уверенным что отрефакторил правильно. А здесь оного не увидел.
artbear; fez; +2 Ответить
14. fez 46 05.11.08 13:50 Сейчас в теме
Присоединюсь к (8)
Атцы рефакторинга (Кент Бек, Мартин Фаулер) настаивают на том, чтобы рефакторинг НАЧИНАЛСЯ с написания комплекта тестов. Для того, чтобы оный рефакторинг был БЕЗОПАСНЫМ.
10. Strange Device 307 05.11.08 11:45 Сейчас в теме
Считаю, что вынос каждого определения таблицы значений или массива в отдельную функцию или подпрограмму - не улучшает читаемость кода, а только затрудняет его чтение...
11. Vitek 05.11.08 11:55 Сейчас в теме
13. alexk-is 6499 05.11.08 12:03 Сейчас в теме
(10) (11) В данном случае не улучшает т.к. из названия функции совершенно не понятно, что она делает. Но могло бы улучшить, если функция вызывается несколько раз, если название отражает содержание, если добавить комментарии...
12. Altair777 643 05.11.08 12:01 Сейчас в теме
15. artbear 1303 05.11.08 16:09 Сейчас в теме
1. Считаю, что работа по рефакторингу выполнена не полностью.
Например,
- что такое МДКласс и СоздатьМДКласс, совершенно непонятно :(
- ОбойтиХХХ также не очень раскрывает смысл кода :(
- переменная "Описание" также выполняет несколько функций и ее название не очень удачно.
.
2. По тестированию также не очень понятно, было ли оно выполнено или нет - а ведь структура кода довольно сильно изменилась.
.
3. Правильность работы кода, как исходного, так и полученного, не проверял, но терзают смутные сомнения - правильно ли использовать одну и ту же переменную "Описание" на разных уровнях кода? Ведь все время работаем с одним объектом :(
16. artbear 1303 05.11.08 16:20 Сейчас в теме
Также хорошо бы спец.блок
Код
Р = ложь;
Выполнить(Код);
Если Р = истина Тогда
Показать полностью

оформить в виде отдельного блока/метода/функции для обозначения того факта, что юзается спец.переменная P, которая должна быть обязательно использована в коде.
.
Например, ВыполнитьКод_ВозвращающийРезультатОтбораВСпецПеременную_P(Код)
.
А вообще подобное использование такой переменной со спец.названием - это неявная передача данных, что может быть чревато.
Вполне может быть, что проще изменить алгоритм - например, Код это просто выражение на языке 1С, которое должно вернуть Истину или Ложь.
А уж внутренний алгоритм выполнит
ИтоговыйКод = " P = " +Код;
и не будет никаких неявностей.
.
Тут не настаиваю, могут быть выбраны разные пути, в т.ч. и уже существующий :) - дело вкуса.
17. artbear 1303 05.11.08 16:30 Сейчас в теме
А.
Также не очень красиво
Функция ОбойтиМетаданные(П, Код)
функция и получает параметр П и возвращает ту же переменную П :(
А в описании задачи сказано, что П - изначально это пустая структура.
.
Фактически можно либо
1) Создать П внутри ОбойтиМетаданные и возвращать П как результат работы данной функции, а от параметра П избавиться.
2) или избавиться от функции, преобразовав ее в процедуру.
Для данной задачи ИМХО п.1 предпочтительнее.
.
Да и наименование параметра П также совсем не звучит :(
.
Б.
Функция ОбойтиАтрибуты(Атрибуты, ВидАтрибута, П, Описание, Код); - точка с запятой лишняя :( Данная опечатка, похоже, показывает, что код не тестировался :(
.
Данный блок определен как функция, а на самом деле ничего не возвращает - маленький косяк :)
18. ValeriVP 05.11.08 16:31 Сейчас в теме
минус
как минимум по тому, что считаю использовании попыток без обработки исключительных ситуаций грубейшей ошибкой
19. artbear 1303 05.11.08 16:35 Сейчас в теме
Также код внутри блока
Код
Для Каждого Класс ИЗ МДКласc Цикл
КонецЦикла;
Показать полностью

лучше выделить в отдельный метод типа СобратьДанныеПоМетаданному().
Код становится еще проще читать и исправлять.
20. ValeriVP 05.11.08 16:38 Сейчас в теме
также я не могу даже предположить, для каких задач могут пригодиться данные в таком виде
21. Altair777 643 05.11.08 16:50 Сейчас в теме
(20) > также я не могу даже предположить, для каких задач могут пригодиться данные в таком виде
прочитай внимательно шапку
В качестве подопытного кода была выбрана статья http://infostart.ru/blogs/688/. Не буду обсуждать полезность и нужность рассматриваемого кода, просто переставлю строчки кода так, что бы с ними можно было работать.
22. O-Planet 6919 05.11.08 21:51 Сейчас в теме
Вообще имеет смысл что-то оптимизировать, не число буковок сокращая, а меняя саму суть. А придраться можно к чему угодно. Опять же, какова направленность оптимизации? Вариантов 4, как минимум: читабельность, функциональность, скорость, универсальность. Зачем в данном случае была предпринята оптимизация, и чем предложенный вариант лучше оригинала - не раскрыто. Лично мне, начинавшем программировать на С, в предложенном варианте сразу бросаются в глаза ляпы, которые никакой уважающий себя сишник не позволил бы себе. Например: зачем Описание=Новый Структура(); делать в цикле? Это ведь память. СоздатьМДКласс и СоздатьТЗ я бы сделал одним методом, суть у них одинакова, и сделал бы универсально:

Код
// Поля - перечисленные через запятую поля таблицы значений
Функция СоздатьТЗ(Знач Поля)
  ТЗ=Новый ТаблицаЗначений;
  Пока Поля<>"" Цикл
    П=Найти(Поля,",");
    Если П=0 Тогда
      Прервать;
    КонецЕсли;
    Поле=СокрЛП(Лев(Поля,П-1));    
    Поля=Сред(Поля,П+1);
    ТЗ.Добавить(Поле);
  КонецЦикла;
  ТЗ.Добавить(Поля);
  Возврат ТЗ;
КонецФункции
Показать полностью


ПС Poppy осознает свою гениальность... Она тоже стареет?
23. artbear 1303 06.11.08 09:56 Сейчас в теме
(22)
0. Смысл рефакторинга - в первую очередь, это повышение читаемости кода для возможности дальнейшего его исправления, сопровождения/изменения, повышения функциональности и т.д. и т.п.
.
1. Цитата:
>>СоздатьМДКласс и СоздатьТЗ я бы сделал одним методом,
>>суть у них одинакова, и сделал бы универсально:
Не согласен, как раз суть/смысл у них разные :) и нужны отдельные методы для точного понимания, что же делается этим кодом. А вот внутри этих спец.методов уже можно юзать как твое СоздатьТЗ, так и ручное заполнение.
.
2. По Описание = Новый Структура() - главное правило "Не нужно делать преждевременную оптимизацию" ! Нужно смотреть в профайлере уже после написания работоспособного кода и выполнения рефакторинга.
Mechanist; +1 Ответить
24. O-Planet 6919 06.11.08 16:16 Сейчас в теме
>> Не согласен, как раз суть/смысл у них разные :) и нужны отдельные методы для точного понимания
Угу. Припоминаю эксамплы из Borland C 3.1 и BP 7 Там этот подход яростно практиковался, когда каждую мыслю в отдельный метод оформляли. Иногда достаточно обойтись комментарием, имхо, имея универсальный метод. Одно дело - десяток индивидуальных процедур, пусть даже с понятными названиями, другое - одна универсальная с комментариями в каждом конкретном месте ее вызова. Второе все-таки воспринимается проще. Этот подход практикуется, как понимаю, и у разрабов типовых конфигураций.

25. artbear 1303 06.11.08 16:46 Сейчас в теме
(24) Коммент для показа назначения кода очень часто не есть гуд :( при чтении вызовов подобных методов, как правило, неудобно изучать подобный код.
.
Гораздо проще и надежнее писать код так / называть методы так, что они не нуждаются в комментах, а их назначение понятно из их наименования.
.
Разработчики типовых - отдельная песня :)
В основном, конечно, очень грамотные решения, но и частенько совершенно отвратительный код :(
А уж любовь 1С к длиннющим блокам кода - это просто ужас :(
26. O-Planet 6919 06.11.08 22:18 Сейчас в теме
(25) Думаю, лучше сочетать все-таки. 100 поименованных методов - тоже не есть гут. Когда метод унифицирован, то он лучше описывает алгоритм уже на уровне реализации. Даже тут: одно дело - две процедуры "СоздатьМДКласс()" и "СоздатьТЗ()"... Не посмотрев, я даже представить не могу, что может находиться внутри их, особенно в первой. Не вижу из контекста, что такое МДКласс... Если же использовать один метод и там и там то все становится ясно в контексте, плюс - я сразу понимаю, что есть на выходе "СоздатьМДКласс()". Т.е. если сделать

МДКласс= СоздатьТЗ("РегистрыСведений,Справочники,Документы, ... ");
ТЗ=СоздатьТЗ("Класс,Вид,ТЧ,Атрибут, ...");

- то все понятно и по структуре данных, и по их типу.
27. artbear 1303 07.11.08 09:11 Сейчас в теме
(26) 1. Я уже выше писал, что как раз название МДКласс и СоздатьМДКласс совсем неудачны и непонятны :)
2. В данном случае можно ипользовать и этот подход - все понятно и без комментариев.
Но с более сложным кодом такая фишка уже не пройдет :)
И самое главное - у правильного метода не нужно смотреть реализацию, все понятно из его наименования :) Например, твой же СоздатьТЗ не требует доп.комментов :)
28. MSensey 49 07.11.08 09:28 Сейчас в теме
Минус
1. где описание проблем, которые были в исходном коде?
2. что должен был понять читатель этого блога?
oleganatolievich; Makdir; +2 Ответить
29. Makdir 10.11.08 13:57 Сейчас в теме
"1. где описание проблем, которые были в исходном коде?
2. что должен был понять читатель этого блога?"
Присоединяюсь. Важен не сам код решения, а содержание ошибок кода и методология. Лучше было дать сравнительную таблицу типа "верно", "неверно" и "почему именно так", а также рекомендации к составлению оптимального кода, при использовании которых начинающий программист сумел бы обойти "острые углы". Да и, в принципе, рефакторинг в моем понимании предполагает более глубокий анализ кода и структуры данных, а не просто исправление ошибок в исходном коде. Думаю многие со мной согласятся, что это слабое место 1С - инструментарий рефакторинга в ней оставляет желать лучшего.
30. n949eo 13.11.11 19:00 Сейчас в теме
33. oleganatolievich 148 03.03.20 12:56 Сейчас в теме
ничего не понял. какой смысл рефакторинга?
34. Palmer1976 180 09.04.21 21:19 Сейчас в теме
Начнем с того, что "просто переставлю строчки" в исполнении автора - это не рефакторинг :)
Это изменение кода одного "неопытного программиста" другим "неопытным программистомкой"
15 вызовов подряд СобратьДанныеПоМетаданному... ну такое.
И режет глаз эти однобуквенные переменные П, Р... истина, ложь с маленькой буквы
user1534961; +1 Ответить
Оставьте свое сообщение

См. также

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

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

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

16.03.2021    2706    velemir    30    

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

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

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

06.04.2021    2995    Neti    7    

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

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

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

25.03.2021    11527    rayastar    45    

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

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

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

30.08.2020    12530    quazare    34    

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

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

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

28.12.2020    5137    comol    31    

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

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

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

08.05.2020    42006    user5300    17    

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

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

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

27.01.2020    43299    ids79    26    

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

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

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

15.01.2020    32582    John_d    22    

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

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

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

10.12.2016    38868    unichkin    74    

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

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

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

30.12.2019    25058    kuzyara    38    

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

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

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

02.12.2019    19620    YPermitin    60    

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

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

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

22.11.2019    10236    Sibars    19    

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

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

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

15.10.2018    32629    tormozit    105    

Полезные процедуры и функции для программиста

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

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

07.10.2019    34272    HostHost    41    

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

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

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

01.10.2019    42656    Yashazz    50    

О программе Postman для тестирования API и для чего она нужна 1С-нику

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

Для чего нужна программа Postman для тестирования API и какая от него польза для 1С-программиста.

24.09.2019    15461    budidich    28    

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

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

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

20.09.2012    79739    tormozit    131    

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

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

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

06.09.2019    72801    rpgshnik    70    

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

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

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

05.09.2019    61208    ids79    55    

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

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

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

05.09.2019    34853    YPermitin    25    

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

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

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

11.07.2007    50645    tormozit    48    

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

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

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

03.09.2019    27571    YPermitin    81    

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

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

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

17.08.2019    37875    ids79    16    

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

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

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

08.08.2019    114730    ids79    69    

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

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

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

10.09.2017    47505    tormozit    74    

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

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

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

02.08.2019    46837    avalakh    26    

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

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

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

31.07.2019    31361    json    15    

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

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

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

26.07.2019    81411    ids79    14    

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

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

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

25.04.2019    16616    m-rv    2    

Управление качеством кода

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

О SonarQube, АПК, EDT. Какие преимущества дает их использование. Для каких команд подходит.

22.07.2019    18145    Stepa86    34    

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

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

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

17.07.2019    41345    ids79    27    

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

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

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

09.07.2019    29280    YPermitin    14    

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

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

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

16.04.2019    21221    m-rv    17    

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

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

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

04.07.2019    20639    SeiOkami    50    

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

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

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

02.07.2019    63662    ids79    17    

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

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

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

25.06.2019    62947    ids79    26    

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

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

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

01.06.2018    32983    m-rv    22    

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

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

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

11.06.2019    27757    dmurk    146    

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

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

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

22.05.2019    34084    YPermitin    7    

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

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

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

16.05.2019    51851    YPermitin    30    

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

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

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

05.12.2017    29017    itriot11    34    

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

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

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

07.04.2019    38781    ellavs    127    

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

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

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

28.03.2019    29027    ellavs    90    

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

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

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

14.03.2019    35614    YPermitin    53    

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

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

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

27.01.2016    79081    Serginio    113    

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

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

В статье собраны наиболее распространенные ошибки при работе с хранилищем конфигурации и способы их обхода и решения.

01.03.2019    51786    Смешной 1С    31    

Разработка и сценарное тестирование с Vanessa-ADD. Отчетность Allure. Автоматизация запуска сценариев

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

Формируем отчетность о результатах выполнения сценариев. Автоматизируем запуск.

26.02.2019    24935    Vladimir Litvinenko    28    

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

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

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

10.11.2018    38611    ids79    40