Каталог решений - Дюжина вопросов для программиста 1С

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

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

В наличии

Одними из методов проверки профессиональных качеств программиста являются его опрос и тестирование. Наиболее оптимальный способ — это постепенное усложнение вопросов. Это не только вопрос — ответ, это ещё шпаргалка для работы с редко встречающимися алгоритмами.

Категория:

Описание

  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)
    	КОНЕЦ КАК Номер
    ИЗ
    	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
    ГДЕ
    	РеализацияТоваровУслуг.Дата МЕЖДУ &начало И &окончание
    

    has been added to your cart:
    Оформление заказа