Дюжина вопросов для программиста 1С

Опубликовал Константин Яремчук (nucha) в раздел Программирование - Практика программирования

Одними из методов проверки профессиональных качеств программиста являются его опрос и тестирование. Наиболее оптимальный способ - это постепенное усложнение вопросов. Это не только вопрос - ответ, это ещё шпаргалка для работы с редко встречающимися алгоритмами.
  1. Можно ли подписаться на событие ПриЗаписи формы элемента справочника?       Нет. (подписка на событие работает только с объектом.). 
  2. При проведении документа возникает ошибка. Мы ставим точку останова в этом месте (или отлавливаем момент ошибки другим способом)  и останавливаемся на проблемной строке. Она находится в общем модуле и нам надо посмотреть, как мы сюда попали из документа. Как это сделать?    Узнать как курсор в отладчике попал именно в эту процедуру/функцию поможет "Стек вызовов"  сочетание клавиш (Alt+Ctrl+C), при этом откроется список "Стека вызовов" где будут перечислены вложенные функции и процедуры где побывал курсор ранее.
  3. Возникла необходимость добавить во все формы списка всех документов конфигурации в процедуру ПриОткрытии одинаковый код. Каким образом быстрее всего можно это сделать, если конфигурация содержит большое количество документов? Во все формы списка документов, в процедуру "При открытии" вставить процедуру "НужнаяПроцедура(ЭтаФорма)" которая будет исполняться в общем модуле «На клиенте»;                         Марат Настоящий (rayastar);   3.1. Выгрузить модули конфигурации в файлы. Запустить конфигуратор с ключом: 
    "C:\Program Files (x86)\1cv8\8.3.8.2137\bin\1cv8.exe" CONFIG /F C:\Users\rmn\Documents\1C\DemoTrd1 /DumpConfigFiles D:\temp –Module 
    3.2. Далее, обратиться к каталогу, куда выгрузились модули и отфильтровать файлы, содержащие слова «Документ» и «ФормаСписка»: 
    МассивФайлов = НайтиФайлы(Путь, "*ФормаСписка*.txt"); 
    МассивФормСписковДокументов = Новый Массив; 
    Для Каждого Стр Из МассивФайлов Цикл 
    Если Найти(Стр.ИмяБезРасширения,"Документ") = 1 Тогда 
    МассивФормСписковДокументов.Добавить(Стр);
    КонецЕсли; 
    КонецЦикла; 

    3.3. На следующем этапе циклом необходимо обойти каждый текстовый файл из массива, найти необходимое вхождение, в нашем случае это слово «ПриОткрытии», найти его позицию и вставить ниже необходимый код. Сохранить файл. 
    3.4. Загрузить файлы в конфигурацию. Для этого необходимо запустить конфигуратор с ключем: "C:\Program Files (x86)\1cv8\8.3.8.2137\bin\1cv8.exe" CONFIG /F C:\Users\rmn\Documents\1C\DemoTrd1 /LoadConfigFiles D:\temp 
  4. Написать обработку, очищающую регистр с независимым режимом записи (управляемая форма).  
    &НаКлиенте
    Процедура ОтчиститьРС()
    	ОтчиститьРСНаСервере();
    КонецПроцедуры
    &НаСервереБезКонтекста
    Процедура ОтчиститьРСНаСервере () 
        НаборЗаписей = РегистрыСведений.Тестовый.СоздатьНаборЗаписей();
        НаборЗаписей.Записать();
    КонецПроцедуры
    

  5. Написать обработку, которая для типовой конфигурации Бухгалтерия предприятия 2.0 устанавливает курс валюты Рубль, равный 1, на каждый день 2012 года. 

    Запрос = Новый Запрос;	
    	Запрос.Текст = 
    		"ВЫБРАТЬ
    		|	ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d) КАК Период
    		|ПОМЕСТИТЬ вт
    		|ИЗ
    		|	(ВЫБРАТЬ 0 КАК a
    		|	ОБЪЕДИНИТЬ
    		|	ВЫБРАТЬ 1
    		|	ОБЪЕДИНИТЬ
    		|	ВЫБРАТЬ 2
    		|	ОБЪЕДИНИТЬ
    		|	ВЫБРАТЬ 3
    		|	ОБЪЕДИНИТЬ
    		|	ВЫБРАТЬ 4
    		|	ОБЪЕДИНИТЬ
    		|	ВЫБРАТЬ 5
    		|	ОБЪЕДИНИТЬ
    		|	ВЫБРАТЬ 6
    		|	ОБЪЕДИНИТЬ
    		|	ВЫБРАТЬ 7
    		|	ОБЪЕДИНИТЬ
    		|	ВЫБРАТЬ 8
    		|	ОБЪЕДИНИТЬ
    		|	ВЫБРАТЬ
    		|		9) КАК aa
    		|		ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    		|			0 КАК b
    		|		ОБЪЕДИНИТЬ
    		|		ВЫБРАТЬ 1
    		|		ОБЪЕДИНИТЬ
    		|		ВЫБРАТЬ 2
    		|		ОБЪЕДИНИТЬ
    		|		ВЫБРАТЬ 3
    		|		ОБЪЕДИНИТЬ
    		|		ВЫБРАТЬ 4
    		|		ОБЪЕДИНИТЬ
    		|		ВЫБРАТЬ 5
    		|		ОБЪЕДИНИТЬ
    		|		ВЫБРАТЬ 6
    		|		ОБЪЕДИНИТЬ
    		|		ВЫБРАТЬ 7
    		|		ОБЪЕДИНИТЬ
    		|		ВЫБРАТЬ 8
    		|		ОБЪЕДИНИТЬ
    		|		ВЫБРАТЬ 
    		|			9) КАК bb
    		|		ПО (ИСТИНА)
    		|		ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    		|			0 КАК c
    		|		ОБЪЕДИНИТЬ
    		|		ВЫБРАТЬ 1
    		|		ОБЪЕДИНИТЬ
    		|		ВЫБРАТЬ 2
    		|		ОБЪЕДИНИТЬ
    		|		ВЫБРАТЬ 3
    		|		ОБЪЕДИНИТЬ
    		|		ВЫБРАТЬ 4
    		|		ОБЪЕДИНИТЬ
    		|		ВЫБРАТЬ 5
    		|		ОБЪЕДИНИТЬ
    		|		ВЫБРАТЬ 6
    		|		ОБЪЕДИНИТЬ
    		|		ВЫБРАТЬ 7
    		|		ОБЪЕДИНИТЬ
    		|		ВЫБРАТЬ 8
    		|		ОБЪЕДИНИТЬ
    		|		ВЫБРАТЬ
    		|			9) КАК cc
    		|		ПО (ИСТИНА)
    		|		ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    		|			0 КАК d
    		|		ОБЪЕДИНИТЬ
    		|		ВЫБРАТЬ 1
    		|		ОБЪЕДИНИТЬ
    		|		ВЫБРАТЬ 2
    		|		ОБЪЕДИНИТЬ
    		|		ВЫБРАТЬ 3
    		|		ОБЪЕДИНИТЬ
    		|		ВЫБРАТЬ 4
    		|		ОБЪЕДИНИТЬ
    		|		ВЫБРАТЬ 5
    		|		ОБЪЕДИНИТЬ
    		|		ВЫБРАТЬ 6
    		|		ОБЪЕДИНИТЬ
    		|		ВЫБРАТЬ 7
    		|		ОБЪЕДИНИТЬ
    		|		ВЫБРАТЬ 8
    		|		ОБЪЕДИНИТЬ
    		|		ВЫБРАТЬ
    		|			9) КАК dd
    		|		ПО (ИСТИНА)
    		|ГДЕ
    		|	aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ)
    		|
    		|ИНДЕКСИРОВАТЬ ПО
    		|	Период
    		|;
    		|
    		|////////////////////////////////////////////////////////////////////////////////
    		|ВЫБРАТЬ
    		|	вт.Период,
    		|	1 КАК Курс,
    		|	1 КАК Кратность,
    		|	&Валюта
    		|ИЗ
    		|	вт КАК вт
    		|ОБЪЕДИНИТЬ
    		|ВЫБРАТЬ
    		|	КурсыВалют.Период,
    		|	КурсыВалют.Курс,
    		|	КурсыВалют.Кратность,
    		|	КурсыВалют.Валюта
    		|ИЗ
    		|	РегистрСведений.КурсыВалют КАК КурсыВалют";
    	
    	Запрос.УстановитьПараметр("КонецПериода", Дата("20121231"));
    	Запрос.УстановитьПараметр("НачалоПериода", Дата("20120101"));
    	Запрос.УстановитьПараметр("Валюта", Справочники.Валюты.НайтиПоКоду("643"));
     	РезультатЗапроса = Запрос.Выполнить();
    	тз = РезультатЗапроса.Выгрузить();
    	Записи = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
    	Записи.Записать();    ///чистить так радикально не обязательно, тогда нужно
        Записи.Загрузить(тз); ///записать в цикле проверив предварительно есть ли записи за 2012г.
    	Записи.Записать(); 	  ///ну да, из пушки по воробьям 
    

     Василий Казьмин (awk) :  с незначительной моей правкой

    датаПериода = Дата("20120101"); ///в 2012г 366 дней
    Набор = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); 
    СтруктураЗаполнения = Новый Структура("Курс, Кратность, Валюта", 1, 1, Валюта); 
    Для ит = 0 По 365 Цикл 
           Запись = Набор.Добавить(); 
           Запись.Период = датаПериода; 
           ЗаполнитьЗначенияСвойств(Запись, СтруктураЗаполнения);
           датаПериода = ДатаНачала + 86400 * ит;
    КонецЦикла; 
    Набор.Записать(); 

  6. Написать обработку установки пометки удаления на все подчиненные элементы данного элемента иерархического справочника. 
    спр = Справочники.Номенклатура.НайтиПоКоду("00000000081");
    	об = спр.ПолучитьОбъект();
    	об.УстановитьПометкуУдаления(Истина,Истина);
    	об.УстановитьПометкуУдаления(Ложь,Ложь);
    

    7.Для типовой конфигурации Бухгалтерия предприятия 2.0 написать обработку, которая сторнирует все остатки по регистру бухгалтерии Хозрасчетный на заданную дату. 

    Запрос = Новый Запрос;
        Запрос.Текст = 
        "ВЫБРАТЬ
        |	ХозрасчетныйОстатки.Счет КАК Счет,
        |	ХозрасчетныйОстатки.Субконто1 КАК Субконто1,
        |	ХозрасчетныйОстатки.Субконто2 КАК Субконто2,
        |	ХозрасчетныйОстатки.Субконто3 КАК Субконто3,
        |	ХозрасчетныйОстатки.Организация КАК Организация,
        |	ХозрасчетныйОстатки.Валюта КАК Валюта,
        |	ХозрасчетныйОстатки.Подразделение КАК Подразделение,
        |	ЕСТЬNULL(ХозрасчетныйОстатки.СуммаОстаток, 0) КАК СуммаОстаток,
        |	ЕСТЬNULL(ХозрасчетныйОстатки.ВалютнаяСуммаОстаток, 0) КАК ВалютнаяСуммаОстаток,
        |	ЕСТЬNULL(ХозрасчетныйОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
        |	ЕСТЬNULL(ХозрасчетныйОстатки.СуммаНУОстаток, 0) КАК СуммаНУОстаток,
        |	ЕСТЬNULL(ХозрасчетныйОстатки.СуммаПРОстаток, 0) КАК СуммаПРОстаток,
        |	ЕСТЬNULL(ХозрасчетныйОстатки.СуммаВРОстаток, 0) КАК СуммаВРОстаток,
        |	Хозрасчетный.Забалансовый,
        |	ЕСТЬNULL(ХозрасчетныйОстатки.СуммаОстатокДт, 0) КАК СуммаОстатокДт,
        |	ЕСТЬNULL(ХозрасчетныйОстатки.СуммаОстатокКт, 0) КАК СуммаОстатокКт,
        |	ЕСТЬNULL(ХозрасчетныйОстатки.КоличествоОстатокДт, 0) КАК КоличествоОстатокДт,
        |	ЕСТЬNULL(ХозрасчетныйОстатки.КоличествоОстатокКт, 0) КАК КоличествоОстатокКт
        |ИЗ
        |	РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата, , , ) КАК ХозрасчетныйОстатки
        |		ЛЕВОЕ СОЕДИНЕНИЕ ПланСчетов.Хозрасчетный КАК Хозрасчетный
        |		ПО ХозрасчетныйОстатки.Счет = Хозрасчетный.Ссылка
        |ИТОГИ
        |	СУММА(СуммаОстаток),
        |	СУММА(ВалютнаяСуммаОстаток),
        |	СУММА(КоличествоОстаток),
        |	СУММА(СуммаНУОстаток),
        |	СУММА(СуммаПРОстаток),
        |	СУММА(СуммаВРОстаток)
        |ПО
        |	Организация";
    	текДата = ТекущаяДата();
        Запрос.УстановитьПараметр("Дата", ТекущаяДата());
    	//Запрос.УстановитьПараметр("Счет", ПланыСчетов.Хозрасчетный.АмортизацияОС_01); Счет = &Счет
        ВыборкаОрганизаций = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
        Пока ВыборкаОрганизаций.Следующий() Цикл
            НовДок = Документы.ОперацияБух.СоздатьДокумент();
            НовДок.Дата = текДата;
            НовДок.Организация = ВыборкаОрганизаций.Организация;
            НовДок.Записать();
            НЗ = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
            НЗ.Отбор.Регистратор.Установить(НовДок.Ссылка);
            Выборка = ВыборкаОрганизаций.Выбрать();
    		счет000 = ПланыСчетов.Хозрасчетный.Вспомогательный;
    		счетЗабалансовый = ПланыСчетов.Хозрасчетный.ДоходыРасходыНеУчитываемые;  
            Пока Выборка.Следующий() Цикл
                стр = НЗ.Добавить();
    		   // Если (Выборка.СуммаОстаток > 0 Или Выборка.ВалютнаяСуммаОстаток > 0 Или Выборка.СуммаНУОстаток > 0
    		   //Или Выборка.СуммаПРОстаток > 0 Или Выборка.СуммаВРОстаток > 0 Или Выборка.КоличествоОстаток > 0) Тогда 
    		   Если Выборка.СуммаОстатокКт <> 0 Тогда 
                    стр.ВалютаДт = Выборка.Валюта;
                    стр.ВалютнаяСуммаДт = Выборка.ВалютнаяСуммаОстаток;
                    стр.КоличествоДт = Выборка.КоличествоОстаток;
                    стр.ПодразделениеДт = Выборка.Подразделение;
                    БухгалтерскийУчет.УстановитьСубконто(Выборка.Счет, стр.СубконтоДт, 1, Выборка.Субконто1, , , Выборка.Счет.ВидыСубконто);
                    БухгалтерскийУчет.УстановитьСубконто(Выборка.Счет, стр.СубконтоДт, 2, Выборка.Субконто2, , , Выборка.Счет.ВидыСубконто);
                    БухгалтерскийУчет.УстановитьСубконто(Выборка.Счет, стр.СубконтоДт, 3, Выборка.Субконто3, , , Выборка.Счет.ВидыСубконто);
                     стр.СуммаВРДт = Выборка.СуммаВРОстаток;
                    стр.СуммаНУДт = Выборка.СуммаНУОстаток;
                    стр.СуммаПРДт = Выборка.СуммаПРОстаток;
                    стр.СчетДт = Выборка.Счет;
    				стр.СчетКт = ?(Выборка.Забалансовый,счетЗабалансовый,счет000);
                Иначе
                    стр.ВалютаКт = Выборка.Валюта;
                    стр.ВалютнаяСуммаКт = Выборка.ВалютнаяСуммаОстаток;
                    стр.КоличествоКт = Выборка.КоличествоОстаток;
                    стр.ПодразделениеКт = Выборка.Подразделение;
                    БухгалтерскийУчет.УстановитьСубконто(Выборка.Счет, стр.СубконтоКт, 1, Выборка.Субконто1, , , Выборка.Счет.ВидыСубконто);
                    БухгалтерскийУчет.УстановитьСубконто(Выборка.Счет, стр.СубконтоКт, 2, Выборка.Субконто2, , , Выборка.Счет.ВидыСубконто);
                    БухгалтерскийУчет.УстановитьСубконто(Выборка.Счет, стр.СубконтоКт, 3, Выборка.Субконто3, , , Выборка.Счет.ВидыСубконто);
                    стр.СуммаВРКт = Выборка.СуммаВРОстаток;
                    стр.СуммаНУКт = Выборка.СуммаНУОстаток;
                    стр.СуммаПРКт = Выборка.СуммаПРОстаток;
                    стр.СчетКт = Выборка.Счет;
                    стр.СчетДт = ?(Выборка.Забалансовый,счетЗабалансовый,счет000);
    			КонецЕсли;
    			стр.Организация = Выборка.Организация;
    			стр.Регистратор = НовДок;
    			стр.Сумма = - Выборка.СуммаОстаток;
     			стр.Период = текДата; 
    		КонецЦикла;
    		НЗ.Записать(Истина);
        КонецЦикла;
    

8. Для документов добавлено свойство «Номер ИнтернетЗаказа». Оно указывается пользователями в документах Заказ покупателя и Реализация товаров и услуг через пиктограмму «Открыть свойства». Пользователь просит, чтобы при вводе документа Реализация товаров и услуг на основании заказа покупателя значение свойства копировалось в документ реализации из заказа. Необходимо написать код и указать, куда его вставить. 

Процедура ПодпискаНаСобытие1ОбработкаЗаполнения(Источник, ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка) Экспорт
 		Запрос = Новый Запрос;
	    Запрос.Текст = 
	    "ВЫБРАТЬ
	    |	ЗначенияСвойствОбъектов.Свойство,
	    |	ЗначенияСвойствОбъектов.Значение
	    |ИЗ
	    |	РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
	    |ГДЕ
	    |	ЗначенияСвойствОбъектов.Объект = &Основание
	    |	И ЗначенияСвойствОбъектов.Свойство = &Свойство";
	    
	  Запрос.УстановитьПараметр("Основание", ДанныеЗаполнения);
	    свойство = ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Номер ИнтернетЗаказа");
	    Запрос.УстановитьПараметр("Свойство", свойство.Ссылка);
	    РезультатЗапроса = Запрос.Выполнить();
	    выб = РезультатЗапроса.Выбрать();                    
	    Если выб.Следующий() Тогда
	    	Если ЗначениеЗаполнено(выб.Значение) И выб.Значение <> Ложь Тогда
	    		СсылкаОб = Источник.ПолучитьСсылкуНового();    
	    		Если СсылкаОб.Пустая() Тогда
	  		СсылкаОб = Документы.РеализацияТоваровУслуг.ПолучитьСсылку();
	  			Источник.УстановитьСсылкуНового(СсылкаОб);
	    		КонецЕсли;
	НаборЗаписейЗначенияСвойств = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьНаборЗаписей();
	    		Запись = НаборЗаписейЗначенияСвойств.Добавить();
	  		Запись.Объект   = СсылкаОб;
	    		Запись.Свойство = выб.Свойство;
	    		Запись.Значение = выб.Значение;
	    	КонецЕсли;
	    	НаборЗаписейЗначенияСвойств.Отбор.Объект.Установить(СсылкаОб);
	    	Попытка
	    		НаборЗаписейЗначенияСвойств.Записать();
	    	Исключение
	    		#Если Клиент Тогда
	    			Предупреждение("Не удалось записать значения свойств:" + Символы.ПС + ОписаниеОшибки());
	    		#КонецЕсли
	  	КонецПопытки;
	    КонецЕсли;

9. Составьте, пожалуйста, запрос, отбирающий из списка номенклатуры только те позиции, чье наименование состоит из трех слов. В результат должны попасть позиции с наименованиями «Вилка столовая серебряная», «Кастрюля глубокая антипригарная» и не должны попасть «Телевизор», «Уксус обыкновенный» и «Ложка серебряная с дырявой ручкой"

ВЫБРАТЬ
	СпрНоменклатура.Ссылка
ИЗ
	Справочник.Номенклатура КАК СпрНоменклатура
ГДЕ
	СпрНоменклатура.Наименование ПОДОБНО "_% _% _%"
	И НЕ СпрНоменклатура.Наименование ПОДОБНО "_% _% _% _%"
	И НЕ СпрНоменклатура.Наименование ПОДОБНО "_% _% _% _% _%"

10. В регистре сведений СвязанныеДокументы два индексированных реквизита – Документ1 и Документ2. Нижеприведенный запрос выдает верные результаты. Попробуйте найти возможность оптимизировать его по скорости 

ВЫБРАТЬ
	Регистр.Документ1,
	Регистр.Документ2
ИЗ
	РегистрСведений.СвязанныеДокументы КАК Регистр
ГДЕ
	(Регистр.Документ1 В (&СписокДокументов)
			ИЛИ Регистр.Документ2 В (&СписокДокументов))

Решение: передадим «СписокДокументов» в временную таблицу, но индексировать её не будем т.к. выборка будет вестись из регистра по его индексированным полям.

(можно проиндексировать временную таблицу и делать выборки из неё «Где Документ1 в (выборка из вт) или Документ2 в (выборка из вт)  

ВЫБРАТЬ
	тз.Документ КАК Документ
ПОМЕСТИТЬ ВТ
ИЗ
	&т КАК тз
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	СвязанныеДокументы.Документ1
ИЗ
	ВТ КАК ВТ
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СвязанныеДокументы КАК СвязанныеДокументы
		ПО ВТ.Документ = СвязанныеДокументы.Документ1

ОБЪЕДИНИТЬ 

ВЫБРАТЬ
	СвязанныеДокументы.Документ2
ИЗ
	ВТ КАК ВТ
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СвязанныеДокументы КАК СвязанныеДокументы
		ПО ВТ.Документ = СвязанныеДокументы.Документ

11. Есть два регистра накопления остатков: Р1 Измерения:  Номенклатура   Ресурсы:Количество  Р2 Измерения: Номенклатура  Ресурсы: Цена

Цена хранится в виде приращения, что позволяет говорить, что остаток по регистру Р2 на дату дает цену на эту дату.

Задача - получить одним запросом продажи за период в разрезе номенклатуры.
Ответ нужен в виде текста запроса.

ПЛАН РЕШЕНИЯ: 

Найти остатки Цены на каджую продажу за период:

  1. Найти продажи: Номенклатура/Количество/Дата  втПродажи  из рег.Р1
  2. Найти последнюю ДатаПоследнейЦены (в рег.Р2) на каждую дату продажи втПродажи  и поместить в  вт_ПродажиДатаЦены для всех Номенклатур
  3. По ДатаПоследнейЦены ( в ПродажиДатаЦены из Р1) найти Цену (по Период в Р2) , рассчитать суммуВ 
    ВЫБРАТЬ
    	Продажи.Номенклатура КАК Номенклатура,
    	Продажи.КоличествоРасход КАК КоличествоПродажа,
    	Продажи.Период КАК ДатаПродажи,
    	Продажи.ХарактеристикаНоменклатуры
    ПОМЕСТИТЬ вт_продажи
    ИЗ
    	РегистрНакопления.ТоварыНаСкладах.Обороты(&начало, &окончание, день, ) КАК Продажи
    
    ИНДЕКСИРОВАТЬ ПО
    	Номенклатура
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    	вт_продажи.Номенклатура КАК Номенклатура,
    	вт_продажи.ХарактеристикаНоменклатуры,
    	вт_продажи.КоличествоПродажа,
    	вт_продажи.ДатаПродажи,
    	МАКСИМУМ(ТоварыНаСкладахОстаткиИОбороты.Период) КАК ДатаПоследнейЦены
    ПОМЕСТИТЬ вт_ДатаЦены
    ИЗ
    	вт_продажи КАК вт_продажи
    		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&начало, &окончание, День, ДвиженияИГраницыПериода, ) КАК ТоварыНаСкладахОстаткиИОбороты
    		ПО вт_продажи.Номенклатура = ТоварыНаСкладахОстаткиИОбороты.Номенклатура
    			И вт_продажи.ХарактеристикаНоменклатуры = ТоварыНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры
    			И вт_продажи.ДатаПродажи >= ТоварыНаСкладахОстаткиИОбороты.Период
    
    СГРУППИРОВАТЬ ПО
    	вт_продажи.ХарактеристикаНоменклатуры,
    	вт_продажи.Номенклатура,
    	вт_продажи.КоличествоПродажа,
    	вт_продажи.ДатаПродажи
    
    ИНДЕКСИРОВАТЬ ПО
    	Номенклатура
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ РАЗЛИЧНЫЕ
    	вт_ДатаЦены.Номенклатура,
    	вт_ДатаЦены.ХарактеристикаНоменклатуры,
    	вт_ДатаЦены.КоличествоПродажа,
    	вт_ДатаЦены.ДатаПродажи,
    	вт_ДатаЦены.ДатаПоследнейЦены,
    	ОстаткиЦенНаДату.КоличествоНачальныйОстаток КАК ЦенаТест,
    	вт_ДатаЦены.КоличествоПродажа * ОстаткиЦенНаДату.КоличествоНачальныйОстаток КАК Сумма
    ИЗ
    	вт_ДатаЦены КАК вт_ДатаЦены
    		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыОрганизаций.ОстаткиИОбороты(&начало, &окончание, День, ДвиженияИГраницыПериода, ) КАК ОстаткиЦенНаДату
    		ПО вт_ДатаЦены.Номенклатура = ОстаткиЦенНаДату.Номенклатура
    			И вт_ДатаЦены.ХарактеристикаНоменклатуры = ОстаткиЦенНаДату.ХарактеристикаНоменклатуры
    ГДЕ
    	ОстаткиЦенНаДату.КоличествоНачальныйОстаток <> 0
    
    12. Данные нижеприведенного запроса по контактной информации контрагентов выводятся с помощью СКД в табличный документ. 
    ВЫБРАТЬ
    	Контрагенты.Ссылка КАК Контрагент,
    	КонтактнаяИнформация.Вид КАК ВидКонтакта,
    	КонтактнаяИнформация.Тип КАК ТипКонтакта,
    	КонтактнаяИнформация.Представление КАК ПредставлениеКонтакта
    ИЗ
    	Справочник.Контрагенты КАК Контрагенты
    		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
    		ПО (КонтактнаяИнформация.Объект = Контрагенты.Ссылка)
    
    При группировке данных по контрагентам отчет выводится в виде
    
     Однако известно, что у каждого контрагента всегда введен один адрес и пользователи хотят видеть его в отдельной колонке на уровне группировки, а не в детальных записях. Каким образом, не изменяя текст запроса, можно получить отчет в виде 
    Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    		
    	СтандартнаяОбработка = Ложь;
    	НастройкиКомпоновки = КомпоновщикНастроек.ПолучитьНастройки();
    	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновки, ДанныеРасшифровки);
    	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
    	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    	ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    	
    	КоличествоСтрок = ДокументРезультат.ВысотаТаблицы;
    	КоличествоКолонок = ДокументРезультат.ШиринаТаблицы;
    	ФактАдрес = "";
    	Смещать = ТипСмещенияТабличногоДокумента.ПоВертикали;
    	Для СтрокаДокумента = -КоличествоСтрок По 3 Цикл
      		ОбластьАдрес = ДокументРезультат.Область(-СтрокаДокумента, 3);  
    		Если ОбластьАдрес.Текст = "Адрес" Тогда
    			 ОбластьАдрес.Текст = ФактАдрес;
    			 ФактАдрес = "";
    		 КонецЕсли;
    		ОбластьВидКонтакта = ДокументРезультат.Область(-СтрокаДокумента, 1);
    		Если ОбластьВидКонтакта.Текст = "Фактический адрес контрагента" Тогда
    			обл = ДокументРезультат.Область(-СтрокаДокумента, 3);
    			ФактАдрес = обл.Текст;
    			обл.Текст = "";
    			ОбластьВидКонтакта.Текст = "";
    			//ДокументРезультат.УдалитьОбласть("R"+(-СтрокаДокумента),Смещать);
    			//ДокументРезультат.Область("R"+(-СтрокаДокумента)).ВысотаСтроки = 1;
    			ДокументРезультат.Область("R"+(-СтрокаДокумента)).ВысотаСтроки = 1;
    		КонецЕсли;
      	КонецЦикла;
     КонецПроцедуры
    

 Следующий запрос выводит в отчет, построенный на основе СКД, список авансовых отчетов 

ВЫБРАТЬ
	АвансовыйОтчет.Номер,
	АвансовыйОтчет.Дата,
	АвансовыйОтчет.СуммаДокумента
ИЗ
	Документ.АвансовыйОтчет КАК АвансовыйОтчет

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

ВЫБРАТЬ
	РеализацияТоваровУслуг.Ссылка,
	ВЫБОР
		КОГДА НЕ ПОДСТРОКА(РеализацияТоваровУслуг.Номер, 1, 1) = "0"
			ТОГДА ПОДСТРОКА(РеализацияТоваровУслуг.Номер, 1, 11)
		КОГДА НЕ ПОДСТРОКА(РеализацияТоваровУслуг.Номер, 2, 1) = "0"
			ТОГДА ПОДСТРОКА(РеализацияТоваровУслуг.Номер, 2, 10)
		КОГДА НЕ ПОДСТРОКА(РеализацияТоваровУслуг.Номер, 3, 1) = "0"
			ТОГДА ПОДСТРОКА(РеализацияТоваровУслуг.Номер, 3, 9)
		КОГДА НЕ ПОДСТРОКА(РеализацияТоваровУслуг.Номер, 4, 1) = "0"
			ТОГДА ПОДСТРОКА(РеализацияТоваровУслуг.Номер, 4, 8)
		КОГДА НЕ ПОДСТРОКА(РеализацияТоваровУслуг.Номер, 5, 1) = "0"
			ТОГДА ПОДСТРОКА(РеализацияТоваровУслуг.Номер, 5, 7)
		КОГДА НЕ ПОДСТРОКА(РеализацияТоваровУслуг.Номер, 6, 1) = "0"
			ТОГДА ПОДСТРОКА(РеализацияТоваровУслуг.Номер, 6, 6)
		КОГДА НЕ ПОДСТРОКА(РеализацияТоваровУслуг.Номер, 7, 1) = "0"
			ТОГДА ПОДСТРОКА(РеализацияТоваровУслуг.Номер, 7, 5)
		КОГДА НЕ ПОДСТРОКА(РеализацияТоваровУслуг.Номер, 8, 1) = "0"
			ТОГДА ПОДСТРОКА(РеализацияТоваровУслуг.Номер, 8, 4)
		КОГДА НЕ ПОДСТРОКА(РеализацияТоваровУслуг.Номер, 9, 1) = "0"
			ТОГДА ПОДСТРОКА(РеализацияТоваровУслуг.Номер, 9, 3)
		КОГДА НЕ ПОДСТРОКА(РеализацияТоваровУслуг.Номер, 10, 1) = "0"
			ТОГДА ПОДСТРОКА(РеализацияТоваровУслуг.Номер, 10, 2)
		ИНАЧЕ ПОДСТРОКА(РеализацияТоваровУслуг.Номер, 11, 1)
	КОНЕЦ КАК Номер
ИЗ
	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
	РеализацияТоваровУслуг.Дата МЕЖДУ &начало И &окончание

См. также

Комментарии
1. Евгений МелхОФФ (EMelihoff) 07.03.17 09:55 Сейчас в теме
Как Вы считаете, программист за какое время должен сделать Ваши вопросы?
Roman100; maksa2005; sheffchik; RaketaSoft; paybaseme; amoarok; 1v7; RainyAugust22; DrAku1a; nucha; xantif_2000; h00k; kambl; WizaXxX; CyberCerber; alex-l19041; +16 Ответить 2
2. kolya_tlt kolya_tlt (kolya_tlt) 10 07.03.17 09:56 Сейчас в теме
(1) конечно за 30 мин. не успел, можем предложить зп -20% от того что ты попросил :)
Roman100; nucha; greenLiss; kambl; CyberCerber; mindcannon; ardn; EMelihoff; +8 Ответить
3. борян петров (TODD22) 15 07.03.17 10:02 Сейчас в теме
Это не только вопрос - ответ, это ещё шпаргалка для работы с редко встречающимися алгоритмами.

Если спрашивать у программиста "редко встречающиеся алгоритмы" то искать вы себе программиста будете очень долго...
Вы себе делаете шпаргалку, а с приходящего программиста спрашиваете умение?
Roman100; abadonna83; maksa2005; curdate; sheffchik; pm74; klinval; Evil Beaver; SazhnevDI; Gorus; zqzq; Ks_83; Mnemonik; lextor; Bassgood; Kosstikk; amoarok; ice-net; DrAku1a; user596640_Atarasyuk; davdykin; Brawler; wolfsoft; Dragonim; Lyolik; alsegor; nucha; artfa; Solovyeff; marsohod; h00k; madonov; kambl; Spacer; TreeDogNight; WizaXxX; CyberCerber; 1cWin; ЛеваРоскошный; alex-l19041; корум; EMelihoff; +42 Ответить
4. Геннадий Жаркой (ifal) 153 07.03.17 10:05 Сейчас в теме
Посмотрел простенькие задачи и по ним есть вопросы/замечания

5. Я вот против таких вещей - задача тривиальная, разовая, а запрос смотреть больно. К тому же еще и весь регистр очищается. Если задача показать решение запросом, то тут конечно надолго.

8. Подскажите, пожалуйста, следующий код для чего нужен?

СсылкаОб = Источник.ПолучитьСсылкуНового();
Если СсылкаОб.Пустая() Тогда
СсылкаОб = Документы.РеализацияТоваровУслуг.ПолучитьСсылку();
Источник.УстановитьСсылкуНового(СсылкаОб);
КонецЕсли;

10. Замените Левое соединение на Внутреннее соединение и уберите объединение, оставь все в одном запросе, будет эффективней.
abadonna83; Yakud3a; xantif_2000; nucha; TreeDogNight; EMelihoff; +6 Ответить 2
5. Андрей Карпов (karpik666) 432 07.03.17 10:07 Сейчас в теме
По поводу 10, почему именно так, почему использовали NULL, вместо внутреннего соединения и объединения?
6. Андрей Карпов (karpik666) 432 07.03.17 10:15 Сейчас в теме
8 тоже интересно, а если пользователь откажется от заполнения и закроет документ на записывая, у нас что останется в базе битая ссылка таким образом?
hulio; sulfur17; DrAku1a; davdykin; Brawler; +5 Ответить 1
7. Алекс Кон (alex-l19041) 8 07.03.17 10:20 Сейчас в теме
по вопросу №5:
я бы не стал городить временную таблицу ВТ, а использовал бы данные регистра Регламентированный производственный календарь (или его аналог), который есть практически во всех типовых конфигурациях.

И даже если конфигурация написана "с нуля" и там такого регистра еще нет, то я бы его добавил.
RaketaSoft; xantif_2000; madonov; arakelyan; ЛеваРоскошный; +5 Ответить 3
8. ediks (ediks) 319 07.03.17 10:28 Сейчас в теме
Мда, запрос по номенклатуре с тремя словами в наименовании не выполнился. Ушел в себя и не вернулся. Всего-то 170 тыс. позиций в справочнике "Номенклатура".
Serg_1C(M); denis_aka_wolf; DrAku1a; vdmkvrshn; +4 Ответить 2
9. kolya_tlt kolya_tlt (kolya_tlt) 10 07.03.17 10:47 Сейчас в теме
(4) по задачам можно определить контору и средний уровень знаний уже имеющихся разработчиков.
получив такие задачи, вместо того чтобы их решать пошел бы собственнику с предложением разогнать штат и перевести все на аутсорс.
в запросе они лидирующие нули отсекают ...
pm74; Ignatov_mu; Merc; Mnemonik; A7758735; denis_aka_wolf; DrAku1a; Бубузяка; Светлый ум; wolfsoft; tux; xantif_2000; artfa; Solovyeff; h00k; madonov; vdmkvrshn; Spacer; necropunk; +19 Ответить
10. Ivan Khorkov (vano-ekt) 850 07.03.17 11:10 Сейчас в теме
спр = Справочники.Номенклатура.НайтиПоКоду("00000000081");

Мы вам перезвоним (с)...
Roman100; curdate; sheffchik; dj_serega; tkv44; zqzq; Mnemonik; hulio; lextor; nihfalck; Bassgood; k2ejrgu@dispostable.com; A7758735; ice-net; denis_aka_wolf; DrAku1a; RocKeR_13; alsegor; xantif_2000; Solovyeff; aka Любитель XML; itriot11; greenLiss; Sergafan10; Spacer; TreeDogNight; CyberCerber; ardn; +28 Ответить
11. Леопольд Роскошный (ЛеваРоскошный) 32 07.03.17 11:19 Сейчас в теме
Первые 2 вопроса нормально, но дальше

какие то редкие находки ...
реализация некоторых, спорна.


(7)
5 вопрос баян рваный со времен 8.1. тогда еще не было РПК везде.



(8) даже себе представить не могу, для чего это надо ...

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

Трактор; denis_aka_wolf; DrAku1a; +3 Ответить
12. Михаил Кончаренко (Anchoret) 17 07.03.17 11:31 Сейчас в теме
3. Очень уж трудоемко получается в каждую форму списка заходить и 100500 раз. Может мой подход в корне не верный, но для БП 3.0, например, я бы добавлял код в процедуру "ОбработкаНовостейКлиент.КонтекстныеНовости_ПриОткрытии(ЭтаФорма)" во многих формах списках она уже присутствует.
6. Создается ревизит объекта или реквизит формы и уже он используется, "НайтиПоКоду" в данном случае нет смысла использовать.
7. По условию надо сказано "на заданную дату" в решении используется текущая дата

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

А так-то до боли знакомые задачи=)
13. Михаил Кончаренко (Anchoret) 17 07.03.17 11:33 Сейчас в теме
(1) Когда мне предложили решить эти задачи, отводилось 2 часа
14. Andrey Erastov (tailer2) 07.03.17 11:35 Сейчас в теме
критика куда более любопытна, чем вопросы

на вопросах я сломался на первом же: "ПриЗаписи формы", - наступила ржака-обоссака

меняй профессию, ваня
Stim213; DrAku1a; davdykin; +3 Ответить
15. Сергей Ожерельев (Поручик) 3535 07.03.17 11:44 Сейчас в теме
Ни фига себе вопросики для теста. Я бы оттуда на всех четырёх выскочил.
Отдайте шляпу и пальто, Манал я ваши именины.
Deslime; Roman100; user637521_s.fsoft; curdate; dj_serega; Gluk_1C; Evil Beaver; Yakud3a; alexdm; nihfalck; Bassgood; A7758735; pavlov_dv; alexveraww; RainyAugust22; DrAku1a; user596640_Atarasyuk; 1cNike; Созинов; Светлый ум; nucha; xantif_2000; artfa; Solovyeff; marsohod; h00k; Serega-artem; Бывалый77; aka Любитель XML; Sergafan10; BlizD; Spacer; ryutao; TreeDogNight; CyberCerber; kolya_tlt; 1cWin; Vovan1975; dgolovanov; TODD22; ЛеваРоскошный; +41 Ответить
16. Николай Беляев (freez1301) 145 07.03.17 11:57 Сейчас в теме
(13) Тоже доводилось решать эти задачи, мне дали вечер
17. Роберт В е р т и н с к и й (v3rter) 07.03.17 12:20 Сейчас в теме
Демотивирует. Глядя на такие способы элементарных, по сути, преобразований данных и действии с интерфейсом совершенно не тянет в программисты-1Сники. Кроме шуток )

Да, порог вхождения в профессию 1Сника низкий, зато через пару ступеней начинается серьёзный программный альпинизм )
18. Иван Петров (dgolovanov) 07.03.17 12:25 Сейчас в теме
(7) Если конфигурация пишется с нуля, то она сращивается с БСП, в котором есть в т.ч. подсистема календарей. А если человек не знает про БСП, но пугает меня порождающими запросами и проверками на NULL полей, которые возвращает временная таблица - я бы с ним не стал связываться.
Evil Beaver; DrAku1a; +2 Ответить
20. борян петров (TODD22) 15 07.03.17 12:42 Сейчас в теме
(19)
Ибо имею достаточный уровень, чтобы выбирать

Ещё бы уровень культуры речи подтянуть что бы в общественном месте матом не ругаться и вы были бы самым завидным соискателем.....
21. MSConfig Infostart (MSConfig) 07.03.17 14:15 Сейчас в теме
Примерно 1 месяц назад я откликался на вакансию удаленного программиста 1С из одного московского франча. Зарплата и условия достойные.
Вот мне они отправили тестовое задание со всеми вопросами, которые в топике. По времени никто не торопил - дали три дня на все про все.
Потом был второй этап - беседа по скайпу.

ЗЫ: На работу позвали, но сам не пошел - выбрал другое предложение)
sulfur17; +1 Ответить
22. Илья Вильчик (TreeDogNight) 14 07.03.17 14:47 Сейчас в теме
Плохо, что больше половины вопросов привязаны к конкретным конфигурациям...
23. Василий Казьмин (awk) 670 07.03.17 15:04 Сейчас в теме
Написать обработку, которая для типовой конфигурации Бухгалтерия предприятия 2.0 устанавливает курс валюты Рубль, равный 1, на каждый день 2012 года.

После решения запросом читать перестал. Выигрыш в производительности крайне сомнителен. Выпендреж и не более. И решившего данным способом человека на работу не взял бы, ибо человек не умеет соотносить сложность и время решения (поддержки), с пользой от решения.
curdate; tkv44; klinval; Gorus; alexht; RaketaSoft; Dem1urg; Merc; Mnemonik; Yakud3a; hulio; Bassgood; sulfur17; Stim213; EMelihoff; pavlov_dv; shalimski; Vovan58; Бубузяка; artempo; alsegor; stos; artfa; marsohod; TreeDogNight; h00k; bulpi; itriot11; KapasMordorov; comol; dgolovanov; ZOMI; asved.ru; vdmkvrshn; корум; BlizD; +36 Ответить 1
24. Vadim Kovyrshin (vdmkvrshn) 13 07.03.17 15:47 Сейчас в теме
В 9-м зачем рассчитывать на строку длиной 2^16 ??? У справочника длина наименования максимум 150 символов. Вот у одного из комментаторов справочник на 170000 и "повесился" на таком запросе... еще бы - для каждого элемента сделать 2^16 сравнений. Сам запрос, конечно интересен в плане идеи, но в плане оптимальности - полный мусор и бред, тем более в качестве ожидаемого от соискателя ответа.
curdate; romankoav; +2 Ответить
25. Дмитрий Тарасов (tarassov) 76 07.03.17 15:55 Сейчас в теме
Не понимаю, почему для пункта 9 такой сложный код?
Предлагаю свой вариант, проверьте:
выбрать 
	СпрНоменклатура.ссылка
из справочник.номенклатура как СпрНоменклатура
где СпрНоменклатура.Наименование Подобно "_% _% _%"
и не СпрНоменклатура.Наименование Подобно "_% _% _% _%"
...Показать Скрыть
sulfur17; Anchoret; Vovan58; nucha; romankoav; +5 Ответить 3
26. Sashares 1 07.03.17 16:04 Сейчас в теме
(25) Потому что все эти вопросы, а так же предложенные решения - бред.
Вместо простого кода в 5-10 строк, алгоритм засовывают в запросы более 100 строк... Ересь.
pm74; curdate; shalimski; artempo; Infector; h00k; bulpi; корум; dgolovanov; +9 Ответить
27. Антон Стеклов (asved.ru) 33 07.03.17 16:17 Сейчас в теме
Какая-то теоретическая наркомания.

(8)
Мда, запрос по номенклатуре с тремя словами в наименовании не выполнился. Ушел в себя и не вернулся. Всего-то 170 тыс. позиций в справочнике "Номенклатура".

Это нормально. Такие задачи вообще требуют под себя отдельное хранение данных.

По существу:
1) Гы-гы, поржал
2) А вот как это сделать, если отладчик недоступен? Справитесь?
3) Не понял - это быстрее чего? Быстрее вставки экземпляра кода в каждую форму, что ли? А если контекст формы не нужен?
4) А будет ли считаться неверным контекстный серверный вызов в этом случае? Вопрос на отсев идиотов?
5) А не лучше ли будет собрать набор прикладным кодом 1С? Операция-то разовая, и смысла в порождающем запросе никакого, а трудозатраты и вероятность ошибки в разы выше.
6) Вопрос на отсев идиотов?
7) А зачем в запросе соединение вместо обращения через точку? Платформа построит его сама.
8) За захардкоженные наименования нужно бить ногами.
9) Разовая задача гораздо быстрее решается на уровне кода 1С, регулярная - созданием и заполнением дополнительного объекта данных.
10) По индексации ВТ все ровно с точностью до наоборот. А интересной такая задача станет, когда добавим условие, что это запрос динамического списка.
11) Вот кто такую структуру данных придумал, тот пусть и пишет. Как раз занят будет, пока Госнаркоконтроль подъедет.
12) А если пользователь захочет по этому адресу сделать группировку?

Итого: Треть вопросов рассчитаны на джуна, треть ошибочна в самой постановке а еще треть решается неправильными методами.

А какая-нибудь девочка-HR примет за чистую монету же.
curdate; Serg_1C(M); hulio; EMelihoff; pavlov_dv; Brawler; artempo; marsohod; bulpi; +9 Ответить
28. Иван Петров (dgolovanov) 07.03.17 16:18 Сейчас в теме
(23) Мне кажется, сначала некий автор открыл для себя "гениальные" запросы и потом придумывал задачи, которые можно решить. Поэтому такие совершенно идиотические примеры.
curdate; vano-ekt; Solovyeff; marsohod; TreeDogNight; bulpi; корум; +7 Ответить
29. Sergey Andreev (starik-2005) 959 07.03.17 16:23 Сейчас в теме
(0)
Одними из методов проверки профессиональных качеств программиста являются его опрос и тестирование.
Забыли слово "малоэффективных". Опрос, как показывает практика, может выявить большую теоретическую базу, известную программисту, но если он на реальных задачах боится трудностей, то вряд ли сможет эффективно работать. Также и тестирование совершенно ничего не говорит о качестве. Есть те, кто в принципе не помнит, какие галки в каком окошке находятся, но знает, где искать; а есть те, кто выучили для теста все эти галки и прочее, но не могут их найти, т.к. не знают, как вообще эту форму с этими галками открыть. При этом первые получат меньше баллов в тесте, чем вторые.

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

Я бы предложил универсальную задачу для оценки качества программиста - переоценка валютных остатков. Написать подобное можно за час максимум, если не вдаваться в подробности. Пользы от этого кода никакого для компании, так что работодателя нельзя будет заподозрить в попытке нахаляву что-то там поиметь. При этом в коде нужно и остатки получить, и курсы. и потом движения сделать на счета доходов/расходов. Красота!
signum2009; klinval; config; Gorus; 1attimo; RaketaSoft; sulfur17; nucha; +8 Ответить
30. Марат Настоящий (rayastar) 59 07.03.17 16:24 Сейчас в теме
Мое решение) Предложили перед НГ франч задачи. После решения все же кое какие решения оказались кривыми
Прикрепленные файлы:
Решение.doc
31. Марат Настоящий (rayastar) 59 07.03.17 16:25 Сейчас в теме
1. Можно ли подписаться на событие ПриЗаписи формы элемента справочника?
Ответ: Нет. На событие формы обработчики не распространяются.
2. При проведении документа возникает ошибка. Мы ставим точку останова в этом месте (или отлавливаем момент ошибки другим способом) и останавливаемся на проблемной строке. Она находится в общем модуле и нам надо посмотреть, как мы сюда попали из документа. Как это сделать?
Ответ: В режиме отладки включить стек вызовов (Отладка – стек вызовов)
3. Возникла необходимость добавить во все формы списка всех документов конфигурации в процедуру ПриОткрытии одинаковый код. Каким образом быстрее всего можно это сделать, если конфигурация содержит большое количество документов?
Решение:
3.1. Выгрузить модули конфигурации в файлы. Запустить конфигуратор с ключом:
"C:\Program Files (x86)\1cv8\8.3.8.2137\bin\1cv8.exe" CONFIG /F C:\Users\rmn\Documents\1C\DemoTrd1 /DumpConfigFiles D:\temp –Module
3.2. Далее, обратиться к каталогу, куда выгрузились модули и отфильтровать файлы, содержащие слова «Документ» и «ФормаСписка»:
МассивФайлов = НайтиФайлы(Путь, "*ФормаСписка*.txt");
	МассивФормСписковДокументов = Новый Массив;
	
	Для Каждого Стр Из МассивФайлов Цикл
		Если Найти(Стр.ИмяБезРасширения,"Документ") = 1 Тогда
		МассивФормСписковДокументов.Добавить(Стр);	
		КонецЕсли;
	КонецЦикла;
...Показать Скрыть

3.3. На следующем этапе циклом необходимо обойти каждый текстовый файл из массива, найти необходимое вхождение, в нашем случае это слово «ПриОткрытии», найти его позицию и вставить ниже необходимый код. Сохранить файл.
3.4. Загрузить файлы в конфигурацию. Для этого необходимо запустить конфигуратор с ключем: "C:\Program Files (x86)\1cv8\8.3.8.2137\bin\1cv8.exe" CONFIG /F C:\Users\rmn\Documents\1C\DemoTrd1 /LoadConfigFiles D:\temp -Module
4. Написать обработку, очищающую регистр с независимым режимом записи (управляемая форма).
Наименование обработки: Очистка регистра сведений УФ.epf
Пояснение: Сделал обработку универсальной, запускать в любой конфигурации в режиме управляемого приложения. Выбрать регистр из выпадающего списка.
5. Написать обработку, которая для типовой конфигурации Бухгалтерия предприятия 2.0 устанавливает курс валюты Рубль, равный 1, на каждый день 2012 года.
Наименование обработки: Редактор курсов валют - 8.2.epf
Пояснение: Сделал обработку универсальной, по умолчанию выбрана валюта руб., курс 1 и период 2012 года.
Конфигурация: Бухгалтерия предприятия, редакция 2.0 (2.0.24.10)
6. Написать обработку установки пометки удаления на все подчиненные элементы данного элемента иерархического справочника.
Наименование обработки: ПометкаНаУдаление.epf.
Пояснение: Обработка тестировалась в БП 2.0. Ключевой особенностью задачи являлось реализация рекурсии. Предусмотрена возможность прервать операцию, если подчиненных элементов очень много (комбинацией Ctrl+Break).
7. Для типовой конфигурации Бухгалтерия предприятия 2.0 написать обработку, которая сторнирует все остатки по регистру бухгалтерии Хозрасчетный на заданную дату.
Наименование обработки: Сторнирование.epf
8. Для документов добавлено свойство «Номер ИнтернетЗаказа». Оно указывается пользователями в документах Заказ покупателя и Реализация товаров и услуг через пиктограмму «Открыть свойства». Пользователь просит, чтобы при вводе документа Реализация товаров и услуг на основании заказа покупателя значение свойства копировалось в документ реализации из заказа. Необходимо написать код и указать, куда его вставить.
Решение: Добавить процедуру в модуль объекта документа «Реализация товаров и услуг» и вызвать в событии ПриЗаписи().
Пояснение к решению: Изначально появилось решение организовать данный механизм в обработке заполнения, но этот вариант не подошел, т.к. была необходима ссылка на документ «Реализация товаров» для записи в регистр Значения свойств объектов. Было принято решение написать процедуру и вызвать ее в событии ПриЗаписи(), т.к. в этой процедуре документ уже создан и имеет ссылку.
Конфигурация: "Управление торговлей", редакция 10.3 (10.3.31.1)



9. Составьте, пожалуйста, запрос, отбирающий из списка номенклатуры только те позиции, чье наименование состоит из трех слов. В результат должны попасть позиции с наименованиями «Вилка столовая серебряная», «Кастрюля глубокая антипригарная» и не должны попасть «Телевизор», «Уксус обыкновенный» и «Ложка серебряная с дырявой ручкой»
Решение:
ВЫБРАТЬ
	Номенклатура.Наименование
ИЗ
	Справочник.Номенклатура КАК Номенклатура
ГДЕ
	Номенклатура.Наименование ПОДОБНО "% % %"
	И (НЕ Номенклатура.Наименование ПОДОБНО "% % % %")
...Показать Скрыть


10. В регистре сведений СвязанныеДокументы два индексированных реквизита – Документ1 и Документ2. Нижеприведенный запрос выдает верные результаты. Попробуйте найти возможность оптимизировать его по скорости
ВЫБРАТЬ
	Регистр.Документ1,
	Регистр.Документ2
ИЗ
	РегистрСведений.СвязанныеДокументы КАК Регистр
ГДЕ
	(Регистр.Документ1 В (&СписокДокументов)
			ИЛИ Регистр.Документ2 В (&СписокДокументов))
...Показать Скрыть

Решение: Так как реквизиты проиндексированы, при этом если они проиндексированы и в запросе по этим полям, выборка происходит значительно быстрее, но на большом количестве данных. На малых объемах прироста либо не будет, либо может даже дольше отрабатываться из-за построения индексов в запросе. Помимо этого, не следует использовать ИЛИ в условии ГДЕ запроса. Вместо этого следует разбить один запрос на несколько и объединить результаты.
ВЫБРАТЬ
		Регистр.Документ1 КАК Документ1,
		Регистр.Документ2 КАК Документ2
	ПОМЕСТИТЬ ВТ
	ИЗ
		РегистрСведений.СвязанныеДокументы КАК Регистр
	
	ИНДЕКСИРОВАТЬ ПО
		Документ1,
		Документ2
	;
	
	////////////////////////////////////////////////////////////­/////////////////
	ВЫБРАТЬ
		ВТ.Документ1 КАК Документ1,
		ВТ.Документ2 КАК Документ2
	ПОМЕСТИТЬ ВТИтог
	ИЗ
		ВТ КАК ВТ
	ГДЕ
		ВТ.Документ1 В(&СписокДокументов)
	
	ОБЪЕДИНИТЬ ВСЕ
	
	ВЫБРАТЬ
		ВТ.Документ1,
		ВТ.Документ2
	ИЗ
		ВТ КАК ВТ
	ГДЕ
		ВТ.Документ2 В(&СписокДокументов)
	
	ИНДЕКСИРОВАТЬ ПО
		Документ1,
		Документ2
	;
	
	////////////////////////////////////////////////////////////­/////////////////
	ВЫБРАТЬ
		ВТИтог.Документ1,
		ВТИтог.Документ2
	ИЗ
		ВТИтог КАК ВТИтог
	
	СГРУППИРОВАТЬ ПО
		ВТИтог.Документ2,
		ВТИтог.Документ1
...Показать Скрыть

11. Условие:
Есть два регистра накопления остатков:
Р1
Измерения: Номенклатура
Ресурсы:Количество
Р2
Измерения: Номенклатура
Ресурсы: Цена
Цена хранится в виде приращения, что позволяет говорить, что остаток по регистру Р2 на дату дает цену на эту дату.
Задача - получить одним запросом продажи за период в разрезе номенклатуры.
Ответ принимается в виде текста запроса.

Решение:

ВЫБРАТЬ
	Р1.Период КАК Дата,
	Р1.Номенклатура,
	Р1.КоличествоРасход КАК Количество,
	Р2.ЦенаКонечныйОстаток КАК Цена,
	Р1.КоличествоРасход * Р2.ЦенаКонечныйОстаток КАК Сумма
ИЗ
	РегистрНакопления.Р1.ОстаткиИОбороты(, , Запись, , ) КАК Р1
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Р2.ОстаткиИОбороты(, , Запись, , ) КАК Р2
		ПО Р1.Номенклатура = Р2.Номенклатура
			И (Р2.Период В
				(ВЫБРАТЬ
					МАКСИМУМ(Р2.Период) КАК Период
				ИЗ
					РегистрНакопления.Р2 КАК Р2
				ГДЕ
					Р2.Период <= Р1.Период
					И Р2.Номенклатура = Р1.Номенклатура))

УПОРЯДОЧИТЬ ПО
	Дата

Результат:

 

СКД

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

ВЫБРАТЬ
	Контрагенты.Ссылка КАК Контрагент,
	КонтактнаяИнформация.Вид КАК ВидКонтакта,
	КонтактнаяИнформация.Тип КАК ТипКонтакта,
	КонтактнаяИнформация.Представление КАК ПредставлениеКонтакта
ИЗ
	Справочник.Контрагенты КАК Контрагенты
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
		ПО (КонтактнаяИнформация.Объект = Контрагенты.Ссылка)
...Показать Скрыть

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


Контрагент
Вид контакта Представление контакта
ООО «Арбат»
Факс контрагента 234-34-46
Телефон контрагента 128-90-65
Адрес доставки Москва, Кремль

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

Контрагент Адрес
Вид контакта Представление контакта
ООО «Арбат» Москва, Кремль
Факс контрагента 234-34-46
Телефон контрагента 128-90-65
Наименование отчета: Адрес.erf
Решение:
1. Создать Вычисляемое поле, в котором будет храниться адрес.
2. Созданное поле разместить в ресурсах и рассчитывать по контрагенту без функций.
3. Видоизменить детальные записи, как это сделано в моем отчете (см. отчет).
4. Для того чтобы строка «адрес доставки» не дублировалась дважды, необходимо наложить отбор внутри детальных записей:
[Вид контакта.Наименование Не равно «Адрес доставки»]
Итоговый результат:



2. Следующий запрос выводит в отчет, построенный на основе СКД, список авансовых отчетов..

ВЫБРАТЬ
	АвансовыйОтчет.Номер,
	АвансовыйОтчет.Дата,
	АвансовыйОтчет.СуммаДокумента
ИЗ
	Документ.АвансовыйОтчет КАК АвансовыйОтчет
...Показать Скрыть



Получается отчет виде


Дата Номер Сумма документа
09.06.09 00000000002 2 400,00
19.06.09 00000000003 401 000,00
13.11.09 00000000004 1 200,00


Каким образом сделать так, чтобы номер выводился в отчет без лидирующих нулей


Дата Номер Сумма документа
09.06.09 2 2 400,00
19.06.09 3 401 000,00
13.11.09 4 1 200,00

Наименование отчета: Номер документа без нулей.erf
Конфигурация: Бухгалтерия предприятия, редакция 2.0 (2.0.24.10)
Решение: Наиболее оптимальным решением будет создать вычисляемое поле и вызвать функцию в выражении: ПрефиксацияОбъектовКлиентСервер.ПолучитьНомерНаПечать(Номер). Данная функция возвращает номер документа без лидирующих нулей и префиксов. В функцию необходимо передать номер. При необходимости, можно выводить номер с префиксом. В большинстве типовых решений присутствует эта или похожая функция.
При использовании внешних функций в вычисляемых полях требуется программная инициализация и компоновка отчета, а также включить возможность использования внешних функций, т.к. по умолчанию она отключена.

//Выполним компоновку с помощью процессора компоновки
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ,ДанныеРасшифровки, Истина);

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

ВЫБОР
	КОГДА ПОДСТРОКА(Номер, 1, 10) = "0000000000"
		ТОГДА ПОДСТРОКА(Номер, 11, 1)
	КОГДА ПОДСТРОКА(Номер, 1, 9) = "000000000"
		ТОГДА ПОДСТРОКА(Номер, 10, 2)
	КОГДА ПОДСТРОКА(Номер, 1, 8) = "00000000"
		ТОГДА ПОДСТРОКА(Номер, 9, 3)
	КОГДА ПОДСТРОКА(Номер, 1, 7) = "0000000"
		ТОГДА ПОДСТРОКА(Номер, 8, 4)
	КОГДА ПОДСТРОКА(Номер, 1, 6) = "000000"
		ТОГДА ПОДСТРОКА(Номер, 7, 5)
	КОГДА ПОДСТРОКА(Номер, 1, 5) = "00000"
		ТОГДА ПОДСТРОКА(Номер, 6, 6)
	КОГДА ПОДСТРОКА(Номер, 1, 4) = "0000"
		ТОГДА ПОДСТРОКА(Номер, 5, 7)
	КОГДА ПОДСТРОКА(Номер, 1, 3) = "000"
		ТОГДА ПОДСТРОКА(Номер, 7, 8)
	КОГДА ПОДСТРОКА(Номер, 1, 2) = "00"
		ТОГДА ПОДСТРОКА(Номер, 1, 9)
	ИНАЧЕ ПОДСТРОКА(Номер, 1, 11)
КОНЕЦ
...Показать Скрыть

Демонстрация:



Выводы:
Первый вариант с вызовом функции считаю более оптимальным
В случае если конфигурация самописная, то можно написать собственную функцию по очистке лидирующих нулей и префиксов, сделать ее экспортной и разместить в общем модуле. В заключении потребуется создать вычисляемое поле и передать в эту функцию номер документа.
klinval; nucha; +2 Ответить
32. Евгений Мадонов (madonov) 146 07.03.17 16:48 Сейчас в теме
5.
Чем производственный календарь не угодил? Почему оттуда не взять все дни 2012 года?

ВЫБРАТЬ 
РегламентированныйПроизводственныйКалендарь.ДатаКалендаря Как период
ПОМЕСТИТЬ ВТ
ИЗ
РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
Где
РегламентированныйПроизводственныйКалендарь.ДатаКалендаря >= ДатаВремя(2012,1,1)
и РегламентированныйПроизводственныйКалендарь.ДатаКалендаря <= ДатаВремя(2012,12,31)
...Показать Скрыть


Нет, мне вполне понятно как работает ваш велосипед... но зачем?

Добавьте тогда
13. Напишите функцию, которая бы являлась полным аналогом встроенной функции "ЧислоПрописью()".
займете кандидата на какое-то время.
Прикрепленные файлы:
Maxis; ЛеваРоскошный; +2 Ответить 1
33. Олег Филиппов (comol) 2807 07.03.17 16:52 Сейчас в теме
Ах, корм для троллей :)). Люблю такие статьи.

Если не распространяться на тему что вопросы НЕ РАСКРЫВАЮТ ПОНИМАНИЯ программистом механизмов платформы. И не испытавают владения типовыми приёмами разработки, ещё и содержат много косяков:

3) Вы даже не представляете сколько для этого есть способов. Ни один из которых не начинается со слова "прописать"
5) Сказали уже - мягко говоря "сомнительное" решение
6) На одну транзакцию записи больше + возможен код при пометке удаления. Самый красивый код - не всегда самый верный.
7) Есть штатная возможность заполнить бух операцию сторно в бухгалетрии 2.0 + нужно использовать транзакции
8) "Предупреждение" в коде, на современной конфигурации?... ай ай
9) Я конечно тут уже могу ошибаться... а чем не понравилось "подобно". 3 разделителя, и не 4 разделителя. Всегда вроде так писал...
10) ну тут вообще :))) Сколько документов обычно передаётся в ВТ? один? Или миллион? В зависимости от этого "оптимизация" будет разной
11)
12) Вычисляемая колонка и функция общего модуля по строчке, не? :)))
klinval; h00k; awk; tarassov; +4 Ответить
34. Дмитрий Скляр (dvs691) 07.03.17 17:07 Сейчас в теме
(32) Именно такую задачу мне задавали на собесодовании
35. Константин Яремчук (nucha) 78 07.03.17 17:26 Сейчас в теме
(4) п.5 Если не запросом, то перебор всех дней в году? Есть решение? - добавлю еще одно решение от Вас.
п.8 Проверка - присвоена ли ему ссылка нового ранее? Если нет, то присваиваем.
п.10 красивей - да, быстрей - не уверен...
36. Константин Яремчук (nucha) 78 07.03.17 17:31 Сейчас в теме
(7) для разовой задачи, может не нужно регистр добавлять?
37. Sashares 1 07.03.17 17:38 Сейчас в теме
(35) п.5 Не запросом - элементарный алгоритм из 2х циклов.
Если вы не можете сформулировать такой алгоритм, может вам не стоит писать такие статьи?

Год = "2012";
Для ТекМес = 1 По 12 Цикл
	Для ТекДень = 1 По 31 Цикл
		ТекДата = Дата(Год,ТекМес,ТекДень);
		
		//Тут запись в регистр
	
		Если КонецДня(ТекДата) = КонецМесяца(ТекДата) Тогда
			Прервать;
		КонецЕсли;	
	КонецЦикла;	
КонецЦикла;
...Показать Скрыть
38. Василий Казьмин (awk) 670 07.03.17 17:40 Сейчас в теме
(35) Константин,

Дней = (ДатаНачала - ДатаОкончания)/365;

Набор = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();

СтруктураЗаполнения = Новый Структура("Курс, Кратность, Валюта", 1, 1, Валюта);

Для ит = 0 По Дней Цикл

Запись = Набор.Добавить();
Запись.Период = Дата Начала + 86400 * ит;
ЗаполнитьЗначенияСвойств(Запись, СтруктураЗаполнения);
КонецЦикла;

Набор.Записать();
...Показать Скрыть


Если вставите замер времени, то основная проблема будет в последней строке (если вы не заполняете столетие, а один-пять лет)
39. Василий Казьмин (awk) 670 07.03.17 17:42 Сейчас в теме
40. Sashares 1 07.03.17 17:44 Сейчас в теме
(39) Не будет 30.02.2012. Если текущая дата конец месяца - цикл прерывается.
41. Василий Казьмин (awk) 670 07.03.17 17:50 Сейчас в теме
42. mrv mrv (m-rv) 19 07.03.17 18:05 Сейчас в теме
тест спорный. на примере шестого вопроса:
а) предложенное решение имеет избыточность записи корневого элемента (если элементов 100500 - не критично, а если 3 - критично)
б) предложенное решение имеет побочные явления (отработают обмены, подписки на корневом элементе, при чем дважды)
в) в предложенном решении не гарантируется консистентность результата (отсутствие транзакции может привести к пометке удаления всех элементов, включая корневой)
43. Константин Яремчук (nucha) 78 07.03.17 18:07 Сейчас в теме
(38) нужна поправка на високосный год. В нем 366 дней.
44. Константин Яремчук (nucha) 78 07.03.17 18:28 Сейчас в теме
(25) в выборку попали наименования состоящие из 5 слов. «Ложка серебряная с дырявой ручкой» -вероятно попали бы. Повторить:
и не СпрНоменклатура.Наименование Подобно "_% _% _% _% _% и т.д. Даже если повторить 20 раз, будет все равно лучше.
45. Sashares 1 07.03.17 18:45 Сейчас в теме
(44)Потому что условие в строке Подобно без нижнего подчеркивания.
Прикрепленные файлы:
46. Петр Базелюк (pbazeliuk) 1244 07.03.17 19:01 Сейчас в теме
4. Ответ не полностью правильный, для больших баз может привести к падению кластера сервера.
5. Зачем удалять данные не связанные с 2012 годом и другой валютой?
6. Реализация ужасная
8. Реализация требует оптимизации. Не нужно забывать про агрегатные данные
9-12. Присутствуют проблемы с постановкой задач, а так же реализацией.
47. Геннадий Жаркой (ifal) 153 07.03.17 20:05 Сейчас в теме
(35)
5. Выше уже ответили, самый обычный код циклом.
8. С этим понятно, опять же ваше уже написали, что в случае отмены записи нового документа повиснет запись с неизвестной ссылкой, внутренне лично для меня не приемлемое решение.
10. Конечно быстрее, хотя бы потому, что у вас через объединение два запроса, а сделать можно в одним запросом через внутреннее соединение. Как вы знаете, соединение и объединение таблиц - это дорогие операции, уменьшение их приведет к хорошему росту производительности.
48. Дамир Закиров (Dzenn) 23 07.03.17 22:24 Сейчас в теме
"Нужен мне работник:
Повар, конюх и плотник.
А где найти мне такого
Служителя не слишком дорогого?"

Искать по таким тестам долго будете )
Yakud3a; nucha; Solovyeff; +3 Ответить
50. Максим Сухов (MaxS) 229 08.03.17 06:51 Сейчас в теме
А не проще ли просто спросить умеешь ли то ли то? Как бы ты делал это? В устном диалоге. Если есть сомнение в честности ответов, попросить подробности реализации. Это будет быстрее и комфортнее для собеседников.
Когда-то давно ходил на собеседования. Если бы мне предложили решить все вопросы, я бы просто ушел.

Невозможно в голове держать все эффективные алгоритмы. Перед каждой задачей проще нагуглить и собрать имеющиеся решения (и свои прошлые тоже), отсеять неправильные, погрузиться в материал и выдать свой правильный вариант.
klinval; simich; корум; Brawler; h00k; DmitryKSL; nucha; bash08; +8 Ответить
51. Александр (МимохожийОднако) 116 08.03.17 07:42 Сейчас в теме
Статья замечательно провоцирует на комментарии. Для одного техзадания будет столько решений, сколько программистов. У каждого есть свой набор шпаргалок, но не каждый решается вывалить это на рассмотрение. Автор смел.
bow; Inkasor; nucha; +3 Ответить 1
52. борян петров (TODD22) 15 08.03.17 07:57 Сейчас в теме
(51)
Автор смел.

В чём смелость?
53. Андрей Привалов (andybs) 08.03.17 09:25 Сейчас в теме
Меня при выборе программиста интересует эффективность и отсутствие быдлокода.
Если задача "разовая", да хоть запрос в цикле, если он на это потратил 5 минут и не "повесил" базу.
Умения в таких задачах использовать "типовые" обработки типа "Групповая обработка справочников и документов" для меня интереснее, чем
"об = спр.ПолучитьОбъект();
об.УстановитьПометкуУдаления(Истина,Истина);
об.УстановитьПометкуУдаления(Ложь,Ложь);"
который, в общем то "фича" и к системному программированию значения не имеет.
Но так или иначе - автору спасибо. Что-то взял в "шпаркалку", хоть и понимаю, что вряд ли пригодиться :)
qazaz2; nucha; +2 Ответить 2
54. Евгений Мадонов (madonov) 146 08.03.17 10:03 Сейчас в теме
(34) и сколько разрядов по итогу поддерживала функция?
А дробные числа?
А склонения единиц измерений?
А сколько ЯЗЫКОВ?
=))

Я не спорю, если задаться целью и иметь достаточное количество времени, это всё можно реализовать на встроенном языке.
НО ЗАЧЕМ?

Скажем так, получи я подобную задачу на собеседовании... то я бы сделал соответствующие выводы о адекватности и вменяемости потенциального работодателя.
Brawler; nucha; +2 Ответить 1
55. Sergey Andreev (starik-2005) 959 08.03.17 11:01 Сейчас в теме
(53)
да хоть запрос в цикле, если он на это потратил 5 минут и не "повесил" базу.
Ага, а потом он в большой базе такое наваяет и документ вместо 10 секунд будет проводиться полчаса? Такого кода в любой типовой хоть опой ешь, но это не значит, что так и нужно делать.
56. Александр (МимохожийОднако) 116 08.03.17 11:17 Сейчас в теме
(52) Не всякий решается показывать. А некоторые закрывают комментарии к своим публикациям.Другого не имел в виду, если что
57. Денис Буры (Denic_01) 23 08.03.17 11:39 Сейчас в теме
Извините конечно, но первый же вопрос - ответ, не вызывает ничего кроме недоумения

Можно ли подписаться на событие ПриЗаписи формы элемента справочника?


Нет. (подписка на событие работает только с объектом.).

А точнее - где в вопросе акцент, именно на ОБЪЕКТ ? С каких то пор использовать событие ПриЗаписи у формы стало нельзя использовать ? нюанс про объект домыслен и высосан из пальца уже в ответе ...

Такими уловками обычно пользуются преподы которые хотят завалить:
- Если ответишь ДА, он скажет неправильно потому что объект
- Ответишь НЕТ, скажет неправильно потому что есть у формы такое событие и оно активно используется во многих случаях, надо заметить

но мы мы же не на экзамене в коррумпированном универе ;)
marsohod; +1 Ответить
58. Константин Яремчук (nucha) 78 08.03.17 12:31 Сейчас в теме
(38) вставил в статью Ваш реально толковый комментарий.
59. Андрей (h00k) 44 08.03.17 12:33 Сейчас в теме
(53)
Если задача "разовая", да хоть запрос в цикле, если он на это потратил 5 минут и не "повесил" базу.

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

Естественно замечание выше не касается случаев когда в цикле создаются неявные запросы из-за разыменовывания поля и случаев когда разыменовывание поля в запросе приводит к появлению дополнительных неявных соединений.
60. Игорь Фелькер (Brawler) 292 08.03.17 20:24 Сейчас в теме
(37)
КонецДня(ТекДата) = КонецМесяца(ТекДата)

А вы сами не задумывались сколько может быть внутри зашито математик в КонецДня, КонецМесяца?
Даже если оставлять в такой реализации, то конец месяца (на время 00:00:00) можно было бы вычислить хотя бы до цикла по дням и проверять потом внутри ТекДата = ПоследнееЧислоМесяца
61. Игорь Фелькер (Brawler) 292 08.03.17 20:31 Сейчас в теме
(54) За решение таких задач, как по мне, они еще и заплатить должны, так как это немалый труд!
62. Игорь Фелькер (Brawler) 292 08.03.17 20:44 Сейчас в теме
тут много чего написали, добавлю и я
8.
---
свойство = ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Номер ИнтернетЗаказа");
---

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

в своей практике УПП/КА запилил и использую такую функцию

// Возвращает свойство объекта по имени и назначению свойства
//
// Параметры:
//   ИмяСвойства - Строка - Имя свойства.
//   НазначенияСвойства - ПланыВидовХарактеристикСсылка.НазначенияСвойствКатегорийОбъектов - Назначения свойств.
//   ВызватьИсключениеЕслиСвойствоНеНайдено - Булево - Признак того, нужно ли вызывать исключение, если свойство не найдено, по умолчанию Ложь. (опционально)
//
// Возвращаемое значение
//   ПланыВидовХарактеристикСсылка.СвойстваОбъектов - Найденное свойство или Неопределено, если свойство не найдено.
//
Функция ПолучитьСвойствоОбъектаПоИмениИНазначениюСвойства(ИмяСвойства, НазначенияСвойства, ВызватьИсключениеЕслиСвойствоНеНайдено = Ложь) Экспорт
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	СвойстваОбъектов.Ссылка
		|ИЗ
		|	ПланВидовХарактеристик.СвойстваОбъектов КАК СвойстваОбъектов
		|ГДЕ
		|	СвойстваОбъектов.Наименование = &Наименование
		|	И СвойстваОбъектов.НазначениеСвойства = &НазначениеСвойства";
	
	Запрос.УстановитьПараметр("НазначениеСвойства", НазначенияСвойства);
	Запрос.УстановитьПараметр("Наименование", ИмяСвойства);
	
	ВыборкаДетальныеЗаписи = Запрос.Выполнить().Выбрать();
	
	Если ВыборкаДетальныеЗаписи.Следующий() Тогда
		Возврат ВыборкаДетальныеЗаписи.Ссылка;
	Иначе
		Если ВызватьИсключениеЕслиСвойствоНеНайдено Тогда
			ВызватьИсключение СтрШаблон("Не удалось найти дополнительное свойство '%1' у назначения свойств '%2'.", 
				ИмяСвойства, НазначенияСвойства);
		Иначе
			Возврат Неопределено;
		КонецЕсли;
	КонецЕсли;

КонецФункции
...Показать Скрыть
63. Василий Казьмин (awk) 670 08.03.17 22:07 Сейчас в теме
(43) Там не на 365 делить надо, а на 86400. ибо разность в секундах.
64. Sashares 1 09.03.17 00:29 Сейчас в теме
(60) Это пример алгоритма, на замену реализацией запросом.
Конечно алгоритм можно и немного улучшить, например, предложенным вами способом.
Но смысла как такового в этом нет.
65. Михаил Зотов (ZOMI) 469 09.03.17 00:54 Сейчас в теме
Не дожидаясь отказа, снимаю свою кандидатуру сам.
hulio; 1cmax; +2 Ответить
66. Maximilian Alekseevich (1cmax) 151 09.03.17 02:07 Сейчас в теме
Автор пытается выдавить из испытуемого частные решения странных задач. Ни одно тестирование не выявит реальную практику работы. А как например человек относится к срокам исполнения задачи, что куда важнее если он не новичок. На мой взгляд в тестировании должны быть только вопросы исключающие полное незнание и непонимание сути задач и платформы. А дать нужно реальную задачу, отвести скажем час-два и посмотреть решение, а все эзотерические тесты псу/коту под хвост.
67. Андрей Акулов (DrAku1a) 1198 09.03.17 02:46 Сейчас в теме
(6) Вы правы! Такие манипуляции нужно делать при записи (с проверкой на нового и ОбменДанными.Загрузка).
68. Игорь Фелькер (Brawler) 292 09.03.17 08:24 Сейчас в теме
(66)
Автор пытается выдавить из испытуемого частные решения странных задач. Ни одно тестирование не выявит реальную практику работы. А как например человек относится к срокам исполнения задачи, что куда важнее если он не новичок. На мой взгляд в тестировании должны быть только вопросы исключающие полное незнание и непонимание сути задач и платформы. А дать нужно реальную задачу, отвести скажем час-два и посмотреть решение, а все эзотерические тесты псу/коту под хвост.

Если человек к тебе приходит не круглый ноль, то можно попросить продемонстрировать свои работы включая программный код бегло поглядеть, потом попросить рассказать как и что он там реализовывал.
На всем этом и делать свои выводы.
Тут практически все сталкиваются с совершенно разными задачами и некоторые вещи вообще могли не применяться в работе.
И тут на тебе, на пару вопросов не ответил, при том что в других силен на все 100%, а тебе желтую карточку и прощай...
itriot11; EMelihoff; docerman; +3 Ответить
69. Михаил Кончаренко (Anchoret) 17 09.03.17 08:49 Сейчас в теме
70. Иван Иванов (kosmo0) 71 09.03.17 10:06 Сейчас в теме
(66) Поддерживаю.
Не бывает волшебной палочки. Не бывает универсального механизма при контакте с людьми.
А автор пытается создать простой шаблон. Да шаблон резко уменьшает время проверки, но отбрасывает в сторону множество факторов.
71. Павел Романов (Pawlick) 9 10.03.17 02:32 Сейчас в теме
Как сделать чтобы номер выводился в отчет без лидирующих нулей?


1. Создать на вкладке СКД "ВычисляемыеПоля" поле "НомерНаПечать"
2. В выражение записать: "ОбщегоНазначения.ПолучитьНомерНаПечать(Ссылка)" , где "Ссылка" - имя поля в наборе, которым выбирается документ, номер которого нужно очистить от лидирующих нулей, а "ОбщегоНазначения.ПолучитьНомерНаПечать(Ссылка)" - имя экспортной процедуры в одноименном модуле. Справедливо для УТ10, КА1.1, УПП1.3 Заодно и от префиксов очистите. Для остальных конфигураций, уверен, тоже такие процедуры есть.

и не компилировать никому мозг: если хотели на знание языка запросов проверить - достаточно было вопроса №5, а на знание механизмов СКД мой ответ больше подходит.

PS Нет, ну вот интересно все таки, а что ж вы предложить то сможете тому, кто на все на это ответит?

А вообще на память приходит мне одна история:
был у меня один знакомый: после двух пива начинал рассказывать про оперу венскую, как это все прекрасно и так далее, руками размахивал, глаза закатывал. Пока не нарвался на одного культурного скромняжку, который был фанатом этого дела, проехал пол мира на скромную зарплату ради этого. Сидел и помалкивал, пока этот знакомый не завелся в очередной раз. В итоге оказалось, что знакомый мой оперу два раза по радио слышал, и в википедии про две постановки прочел, и то видимо не доконца, потому как не смог "Турандот" от чего то там отличить... Просто таким образом "девах клеил".
Мне вот Ваш "вопросник" его напомнил...













papami; ZOMI; +2 Ответить
72. Ivan Khorkov (vano-ekt) 850 10.03.17 09:30 Сейчас в теме
(37)
из 2х циклов

Много циклов
Год = '20120101';
ТекДень = Год;
//создаем нз
Пока Год(Год)=Год(ТекДень) Цикл
	
	// добавляем в нз

	ТекДень = ТекДень+86400;	
	
КонецЦикла;
// записсываем нз
...Показать Скрыть
73. Кирилл Царев (tkv44) 10.03.17 09:39 Сейчас в теме
Автор серьезно думает, что талант программиста проверяется решением подобных задач?
74. Sashares 1 10.03.17 11:10 Сейчас в теме
(72)
Пока Год(Год)=Год(ТекДень) Цикл

Ну 365/366 раз вычислить функцию Год() от переменной, которая не меняется, тоже оригинальное решение =)
75. Ivan Khorkov (vano-ekt) 850 10.03.17 14:50 Сейчас в теме
(74) зато памяти сэкономил под целую переменную :-D
76. vicmos victor (vicmos) 40 10.03.17 17:15 Сейчас в теме
Зачем это нужно?
человек должен решать проблемы, есть испытательный срок, когда можно договориться по любовно, пустая трата времени при собеседовании.
user668992_adminwl; +1 Ответить
77. Алексей 1 (AlX0id) 13.03.17 18:42 Сейчас в теме
По 11 вопросу - может уже предлагали, но я бы сначала взял двустволку и пристрелил того, кто эту структуру соорудил, съездил бы в лес, закопал его, а затем перестроил бы регистр к *ям.
78. Валерий К (klinval) 198 14.03.17 10:24 Сейчас в теме
9. Составьте, пожалуйста, запрос, отбирающий из списка номенклатуры только те позиции, чье наименование состоит из трех слов. В результат должны попасть позиции с наименованиями «Вилка столовая серебряная», «Кастрюля глубокая антипригарная» и не должны попасть «Телевизор», «Уксус обыкновенный» и «Ложка серебряная с дырявой ручкой"

Вот запрос:
ВЫБРАТЬ
	"Вилка столовая серебряная" КАК Наименование
ПОМЕСТИТЬ Номенклатура

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	"Кастрюля глубокая антипригарная"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	"Телевизор"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	"Уксус обыкновенный"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	"Ложка серебряная с дырявой ручкой"
	
ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	"Два пробела  тут"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	"Три пробела   тут"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	"Ложка серебряная с большой дырявой ручкой"

;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Номенклатура.Наименование
ИЗ
	Номенклатура КАК Номенклатура
ГДЕ
	Номенклатура.Наименование ПОДОБНО "_% _% _%"
	И НЕ Номенклатура.Наименование ПОДОБНО "_% _% _% _%"
	И НЕ Номенклатура.Наименование ПОДОБНО "_% _% _% _% _%"
;	
////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Номенклатура.Наименование
ИЗ
	Номенклатура КАК Номенклатура
ГДЕ
	Номенклатура.Наименование ПОДОБНО "_% _% _%"
	И НЕ Номенклатура.Наименование ПОДОБНО "_% _% _% _%"
;
////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Номенклатура.Наименование
ИЗ
	Номенклатура КАК Номенклатура
ГДЕ
	Номенклатура.Наименование ПОДОБНО "% % %"
И НЕ Номенклатура.Наименование ПОДОБНО "% % % %"
;
////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Номенклатура.Наименование
ИЗ
	Номенклатура КАК Номенклатура
ГДЕ
	Номенклатура.Наименование ПОДОБНО "%[ ]%[ ]%"
И НЕ Номенклатура.Наименование ПОДОБНО "%[ ][^ ]%[ ][^ ]%[ ][^ ]%"
...Показать Скрыть

Получается дано:
Вилка столовая серебряная
Кастрюля глубокая антипригарная
Телевизор
Уксус обыкновенный
Ложка серебряная с дырявой ручкой
Два пробела тут
Три пробела тут
Ложка серебряная с большой дырявой ручкой

Между "пробела тут" количество пробелов "Два" или "Три". Просто в цитате этого не видно, но в коде выше (в запросе) можно увидеть.

1) Ваш вариант решения даст:
Вилка столовая серебряная
Кастрюля глубокая антипригарная
Два пробела тут

2) Ваш вариант решения, но без условия "И НЕ Номенклатура.Наименование ПОДОБНО "_% _% _% _% _%"" - т.к. я так и не понял какие случаи это условие отсекает:
Вилка столовая серебряная
Кастрюля глубокая антипригарная
Два пробела тут

Вывод из 1 и 2 - запросы идентичные. Условие лишнее.
3) Мой вариант, который даёт результат:
Вилка столовая серебряная
Кастрюля глубокая антипригарная

4) Мой вариант, который даёт результат:
Вилка столовая серебряная
Кастрюля глубокая антипригарная
Два пробела тут
Три пробела тут


Вывод: ваш вариант неправильный (или правильный, но для одной конкретной базы, т.е. не универсален и не полный). Как по мне правильно либо решать по варианту 3 (когда мы не учитываем, что между словами может быть больше одного пробела) или по варианту 4 (когда мы учитываем, что то между словами может быть больше одного пробела и как бы их "схлопываем" в один). Примечание: в варианте 4 некоторые квадратные скобки можно убрать без потери функциональности.

Или решать то-же самое кодом. Или комбинированно запросом - кодом. Если задача одноразовая, то можно сначала запросом посмотреть есть ли случаи двух рядом стоящих пробелов в базе и если нет, то решать вариантом 3.

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

Короче вариантов решения одной только этой задачи много! И все они по своему правильные.

Практически все остальные вопросы-ответы из статьи спорны или решаются несколькими методами исходя из ситуации.
79. Александр Дубровский (li5enok) 14.03.17 11:56 Сейчас в теме
Посмотрел на задачи, посмотрел на ответы. И вот что я понял: дебильные ответы делают вопросы такими же!
На 5 задачу никто не дал ответа верного.

Задача:
Написать обработку, которая для типовой конфигурации Бухгалтерия предприятия 2.0 устанавливает курс валюты Рубль, равный 1, на каждый день 2012 года.


Разбор задачи:
Указание конфигурации даёт нам точный набор необходимых метаданных. В задаче четко указана валюта( значение измерения регистра), четко указан курс (о кратности можно догадаться), указан период для записи.

Какого ляда все лепят НаборЗаписей без отборов? Требования указаны в задаче! Почему все перетирают данные которые не относятся к вашей задаче?

1С прекрасно работает с датами (упрощаются школьные изыски с переборами). Для перебора дат нет необходимости собирать их в одну таблицу.

Процедура УстановитьКурсЗаПериод(Знач Валюта, Знач ДатаНачала, Знач ДатаОкончания, Знач Курс, Знач Кратность)
	
	МЗ = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
	МЗ.Валюта	 = Валюта;
	МЗ.Курс		 = Курс;
	МЗ.Кратность = Кратность;
	
	ДеньВСекундах= 86400;
	
	ТекДата = ДатаНачала;
	Пока ТекДата <= ДатаОкончания Цикл
		МЗ.Период = ТекДата;
		МЗ.Записать();
		
		ТекДата = ТекДата + ДеньВСекундах; 
	КонецЦикла;
	
КонецПроцедуры
...Показать Скрыть
80. Роберт В е р т и н с к и й (v3rter) 14.03.17 13:09 Сейчас в теме
(79)
А вариант набить нужными датами таблицу значений в цикле, перетащить во временную таблицу запроса и соединить?
81. Александр Дубровский (li5enok) 14.03.17 14:02 Сейчас в теме
(80) Это породит лишние сущности: таблица значений, Запрос, менеджер временных таблиц, выборка из запроса. При этом пиковое значение использования ресурсов будет выше. Для простой задачки это не повлияет ни на что, но нужно прививать правильный подход к решению поставленных задач сразу. Были случаи когда алгоритмически задачу можно считать решенной, но сервер падает через пару минут после запуска или кластер убивает сеанс по достижению лимита памяти.
82. Дмитрий Тарасов (tarassov) 76 16.03.17 09:55 Сейчас в теме
(78)
 ВЫБРАТЬ Номенклатура.Наименование
ИЗ  Номенклатура КАК Номенклатура
ГДЕ Номенклатура.Наименование ПОДОБНО "%[ ]%[ ]%"
       И НЕ Номенклатура.Наименование ПОДОБНО "%[ ][^ ]%[ ][^ ]%[ ][^ ]%"


Хорошая идея.
Но она не учитывает наличие ведущих и завершающих пробелов

предлагаю подкорректированный вариант:

ВЫБРАТЬ Номенклатура.Наименование
ИЗ  Номенклатура КАК Номенклатура
ГДЕ Номенклатура.Наименование ПОДОБНО "%[^ ] %[^ ] %[^ ]%"
       И НЕ Номенклатура.Наименование ПОДОБНО "%[^ ] %[^ ] %[^ ] %[^ ]%"
...Показать Скрыть


для справки - полный текст проверочных запросов
ВЫБРАТЬ
    "Три искомых слова" КАК Наименование
ПОМЕСТИТЬ Номенклатура

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "ОдноСлово"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Два слова"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Четыре слова включающие трислова"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Пять слов включающие три слова"
    
ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "шесть слов включающие и три слова"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Два пробела  тут"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Три пробела   тут"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    " ведущий пробел тут "

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "  Ведущие  Пробелы  Тут  "

;
////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    Номенклатура.Наименование
ИЗ
    Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Наименование ПОДОБНО "% % %"
;
////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    Номенклатура.Наименование
ИЗ
    Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Наименование ПОДОБНО "% % %"
И НЕ Номенклатура.Наименование ПОДОБНО "% % % %"
;
////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    Номенклатура.Наименование
ИЗ
    Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Наименование ПОДОБНО "_% _% _%"
    И НЕ Номенклатура.Наименование ПОДОБНО "_% _% _% _%"
;
////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    Номенклатура.Наименование
ИЗ
    Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Наименование ПОДОБНО "%_ %_ %_"
    И НЕ Номенклатура.Наименование ПОДОБНО "%_ %_ %_ %_"
;
////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    Номенклатура.Наименование
ИЗ
    Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Наименование ПОДОБНО "%[ ]%[ ]%"
;
////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    Номенклатура.Наименование
ИЗ
    Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Наименование ПОДОБНО "%[ ]%[ ]%"
И НЕ Номенклатура.Наименование ПОДОБНО "%[ ][^ ]%[ ][^ ]%[ ][^ ]%"
;
////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    Номенклатура.Наименование
ИЗ
    Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Наименование ПОДОБНО "_% _% _%"
И НЕ Номенклатура.Наименование ПОДОБНО "_%[ ][^ ]%[ ][^ ]%[ ][^ ]%"
;
////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    Номенклатура.Наименование
ИЗ
    Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Наименование ПОДОБНО "_% _% _%"
И НЕ Номенклатура.Наименование ПОДОБНО "%[^ ] %[^ ] %[^ ] %[^ ]%"
;
////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    Номенклатура.Наименование
ИЗ
    Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Наименование ПОДОБНО "% % %"
И НЕ Номенклатура.Наименование ПОДОБНО "%[^ ] %[^ ] %[^ ] %[^ ]%"
;
////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    Номенклатура.Наименование
ИЗ
    Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Наименование ПОДОБНО "%[^ ] %[^ ] %[^ ]%"
И НЕ Номенклатура.Наименование ПОДОБНО "%[^ ] %[^ ] %[^ ] %[^ ]%"
...Показать Скрыть
83. Вадим Мориков (vadim1011985) 40 16.03.17 11:16 Сейчас в теме
(79) А ничего что у Вас запись идет в цикле каждый раз ? 365 дней - 365 раз записал. Точнее даже не так - не вижу смысла записывать по одной записи - когда надо заполнить за период , по мне так лучше использовать набор записей
84. Александр Дубровский (li5enok) 16.03.17 14:28 Сейчас в теме
(83) Именно - одна запись за раз. Хотите ускорить - оберните в транзакцию, только имейте ввиду, что параллельность работы снизится.
У набора записей должен устанавливаться отбор. Если его не установить, то затрется вся информация в регистре и запишется только та, что была в наборе. Это грубая ошибка!
Отбор в наборе устанавливается строго на равенство, поэтому придется 365 раз установить отбор по периоду, а, значит, и 365 раз произвести запись. Не нравится менеджер записи - используйте набор записей с одной строчкой и установленными отборами по периоду и валюте.
85. A X (ditp) 48 16.03.17 14:56 Сейчас в теме
(84) Н
е нравится менеджер записи - используйте набор записей с одной строчкой и установленными отборами по периоду и валюте.
или включите мозг фантазию:
руб		= Константы.ВалютаРегламентированногоУчета.Получить();
Запрос	= Новый Запрос("ВЫБРАТЬ
      	               |	ЕСТЬNULL(К.ДатаКалендаря, КВ.Период) КАК Период,
      	               |	ИСТИНА КАК Активность,
      	               |	&Валюта,
      	               |	ЕСТЬNULL(КВ.Курс, 1) КАК Курс,
      	               |	ЕСТЬNULL(КВ.Кратность, 1) КАК Кратность
      	               |ИЗ
      	               |	РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК К
      	               |		ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КВ
      	               |		ПО К.ДатаКалендаря = КВ.Период
      	               |			ГДЕ КВ.Валюта = &Валюта");	
Запрос.Параметры.Вставить("Валюта", руб);

рег	= РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
рег.Отбор.Валюта.Установить(руб);
рег.Загрузить(Запрос.Выполнить().Выгрузить());
рег.Записать(Истина);
...Показать Скрыть


P.S. При выполнении этого кода ни одна лишняя запись не пострадала.
86. Александр Дубровский (li5enok) 16.03.17 15:06 Сейчас в теме
(85) Уже лучше, но это решение другой задачи. Требовалось установить курс только в определенном периоде
87. A X (ditp) 48 16.03.17 15:09 Сейчас в теме
(86) мне откровенно лень было дописывать к
ГДЕ КВ.Валюта = &Валюта

еще
И К.ДатаКалендаря Между &Нач и &Кон

Извините.
88. Александр Дубровский (li5enok) 16.03.17 15:53 Сейчас в теме
(87) Допустим, что производственный календарь заполнен и не будем к этому придираться(хотя следует, т.к. алгоритм становится зависим от другой сущности)
Ваш запрос снова отберет узкий набор и запись перетрет все курсы рубля кроме указанного диапазона.
Чтобы не нагнетать напряженности в диалоге публикую свой запрос
ВЫБРАТЬ
	К.Дата КАК Период,
	&Валюта,
	&Курс КАК Курс,
	&Кратность КАК Кратность
ИЗ
	РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК К
ГДЕ
	РегламентированныйПроизводственныйКалендарь.Дата МЕЖДУ &Нач И &Кон

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	КВ.Период,
	&Валюта,
	КВ.Курс,
	КВ.Кратность
ИЗ
	РегистрСведений.КурсыВалют КАК КВ
ГДЕ
	КВ.Валюта = &Валюта
	И (КВ.Период < &Нач
			ИЛИ КВ.Период > &Кон)
...Показать Скрыть


Но всё равно я не сторонник перезаписывать весь регистр если нужно только несколько строк, хотя с регистром КурсыВалют это способ не вылетает за пределы оперативной памяти.
89. A X (ditp) 48 16.03.17 15:54 Сейчас в теме
(88)
Ваш запрос снова отберет узкий набор и запись перетрет все курсы рубля кроме указанного диапазона.
на что спорим?
90. Александр Дубровский (li5enok) 16.03.17 16:02 Сейчас в теме
(89) не знаю как тут заливать $m, придется спорить на рубли. Ставлю 1000 руб на то, что ваш алгоритм дополнит за указанный период курс рубля курсом 1, оставив при этом установленные записи (хотя для рубля в данном случае вряд ли) и удалит все курсы рубля вне указанного диапазона.
91. A X (ditp) 48 16.03.17 16:10 Сейчас в теме
92. A X (ditp) 48 16.03.17 16:40 Сейчас в теме
(90) в общем, писал не проверяя, практика показала, что мою версию нужно слегка отредактировать:
ВЫБРАТЬ
	ЕСТЬNULL(К.ДатаКалендаря, КВ.Период) КАК Период,
	ИСТИНА КАК Активность,
	&Валюта,
	ЕСТЬNULL(КВ.Курс, 1) КАК Курс,
	ЕСТЬNULL(КВ.Кратность, 1) КАК Кратность
ИЗ
	РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК К
		ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КВ
		ПО К.ДатаКалендаря = КВ.Период
			
где (КВ.Валюта  is null или КВ.Валюта = &Валюта) 
И ( К.ДатаКалендаря  is null или К.ДатаКалендаря между &нач и &кон)
УПОРЯДОЧИТЬ ПО
	Период
...Показать Скрыть

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

Впрочем, возможность с помощью запроса получить корректный набор записей все равно считаю доказанным.
93. Александр Дубровский (li5enok) 16.03.17 16:58 Сейчас в теме
(92) Коллега, Вы первый человек в моей жизни, который не стал сливаться и увиливать в споре, уважаю! Отписался в личку.
Чтобы не было обидно за спор, оставляю за вами право обратится ко мне за консультацией если прижмет ситуация.

С помощь запроса конечно же можно получить правильный набор (свой вариант я уже давал).
94. A X (ditp) 48 16.03.17 17:03 Сейчас в теме
(93)
оставляю за вами право обратится ко мне за консультацией если прижмет ситуация
А вот щаз обидно было.
95. Александр Дубровский (li5enok) 16.03.17 17:08 Сейчас в теме
(94)Извините, если обидел, но запрос так и остался неверный.
96. A X (ditp) 48 16.03.17 17:26 Сейчас в теме
Воистину, поспешишь - людей насмешишь.
97. Александр Дубровский (li5enok) 16.03.17 17:33 Сейчас в теме
(96) Коллега, выигрыш получил, благодарю!
Если вы найдете ошибку в моем первоначальном алгоритме, я верну вам половину суммы. Как вам такой Challenge?
98. A X (ditp) 48 17.03.17 01:55 Сейчас в теме
(97) в этом-то
Процедура УстановитьКурсЗаПериод(Знач Валюта, Знач ДатаНачала, Знач ДатаОкончания, Знач Курс, Знач Кратность)
    
    МЗ = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
    МЗ.Валюта     = Валюта;
    МЗ.Курс         = Курс;
    МЗ.Кратность = Кратность;
    
    ДеньВСекундах= 86400;
    
    ТекДата = ДатаНачала;
    Пока ТекДата <= ДатаОкончания Цикл
        МЗ.Период = ТекДата;
        МЗ.Записать();
        
        ТекДата = ТекДата + ДеньВСекундах; 
    КонецЦикла;
    
КонецПроцедуры
...Показать Скрыть

?

Да тут и искать нечего, МЗ.Записать() без МЗ.Прочитать() бессмысленно и беспощадно.
P.S. Возвращать ничего не надо, тыща,в конце концов, не бутерброд, что б ее туда-сюда передавать...
99. Александр Дубровский (li5enok) 17.03.17 10:54 Сейчас в теме
(98) Можно использовать Прочитать(), но тратится время на чтение. Лучше так:

Процедура УстановитьКурсЗаПериод(Знач Валюта, Знач ДатаНачала, Знач ДатаОкончания, Знач Курс, Знач Кратность)
        
    ДеньВСекундах= 86400;
    
    ТекДата = ДатаНачала;
    Пока ТекДата <= ДатаОкончания Цикл

        МЗ = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
        МЗ.Период     = ТекДата;
        МЗ.Валюта     = Валюта;
        МЗ.Курс          = Курс;
        МЗ.Кратность = Кратность;
        
        МЗ.Записать();
        
        ТекДата = ТекДата + ДеньВСекундах; 
    КонецЦикла;
    
КонецПроцедуры
...Показать Скрыть
Оставьте свое сообщение