gifts2017

Несколько рекомендаций готовящимся к 1С:Специалист по Платформе

Опубликовал correct_coding (correct_coding) в раздел Программирование - Сертификация

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

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

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

2. Запустите хотя бы раз синтакс помощник.  Компы там не шибко мощные, и если СП ни разу не запускался с момента установки/обновления 1С, его индексация занимает время.

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

4.  Создайте сразу подсистемы, этим вы сделаете часть работы которую делать нужно все равно обязательно, однако наглядный интерфейс даже во время разработки упростит вам тестирование. Причем для оптимизации времени, как вариант, можно делать так: создаете подсистему ОперативныйУчет, далее в ней три подсистемы Документы, СправочникиИПланы, Регистры. После этого подсистему ОперативныйУчет раскопируйте еще на две (подчиненные тоже скопируются) и переименуйте в БухгалтерскийУчет и Расчет.

 5. Если вы пришли раньше (а я так понял, это все делают) то сидеть ждать, пока препод засунет ключ с лицензиями чтобы запускалась 1С, тоже не следует, откройте блокнот, и создайте себе несколько заготовок кода, который в любом случае понадобится.

 

 ОПЕРАТИВНЫЙ УЧЕТ

 

 6. Новая методика проведения документов. Используется в небольшом проценте задач, однако если попадется, не перемудрите с блокировками, тут ее надо устанавливать при помощи свойства БлокироватьДляИзменения, так же важно включить движения самого документа в запрос по отлову минусов. Пример ниже:

Для каждого Строка Из СписокНоменклатуры Цикл
   Запись = Движения.ТоварыНаСкладах.ДобавитьРасход();
   Запись.Период = Дата;
   Запись.Номенклатура = Строка.Номенклатура;
   Запись.Склад = Склад;
   Запись.Количество = Строка.Количество;
КонецЦикла; Движения.ТоварыНаСкладах.БлокироватьДляИзменения = Истина; // НАБОР БУДЕТ ЗАБЛОКИРОВАН СРАЗУ ПОСЛЕ ЗАПИСИ Движения.ТоварыНаСкладах.Записать(); Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("МоментВремени", Новый Граница(МоментВремени(),ВидГраницы.Включая)); // ВКЛЮЧАЯ ДВИЖЕНИЯ САМОГО ДОКУМЕНТА
Запрос.УстановитьПараметр("Склад", Склад); Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК КоличествоДокумент |ПОМЕСТИТЬ втДанныеДокумента |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры
|ГДЕ

|РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка

|СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТоварыНаСкладахОстатки.Номенклатура, | ТоварыНаСкладахОстатки.КоличествоОстаток |ИЗ | РегистрНакопления.ТоварыНаСкладах.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | втДанныеДокумента.Номенклатура | ИЗ | втДанныеДокумента КАК втДанныеДокумента) | И Склад = &Склад) КАК ТоварыНаСкладахОстатки |ГДЕ | ТоварыНаСкладахОстатки.КоличествоОстаток < 0"; Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Количество() Тогда
Отказ = Истина; КонецЕсли;

 

7. Правильный порядок расположения операндов при расчете себестоимости. Проблема копеек. Есть мнение, что правильно делать так:

НоваяЗапись.Сумма = Выборка.КоличествоДокумент * Выборка.СуммаОстаток / Выборка.КоличествоОстаток;

То есть, умножение идет перед делением, что обеспечит в случае 3 * 10 / 3 число 10 а не число 9.99999999(9), как может быть при совсем неправильном порядке, однако методически такой способ не считается верным (это слова преподавателя из 1С), во-первых, деление по методике должно идти сначала, но деление не суммы на остаток количества, а количества к списанию на количество остатка, во-вторых, при равенстве количеств, лучше просто взять сумму, поэтому делая так, как ниже, проблем быть не должно:

НоваяЗапись.Сумма = ?(Выборка.КоличествоДокумент = Выборка.КоличествоОстаток, Выборка.СуммаОстаток, 
Окр(Выборка.КоличествоДокумент / Выборка.КоличествоОстаток,2) * Выборка.СуммаОстаток);

 

8. Правильная установка момента времени в качестве параметра запроса при проведении документа. Если документ по вашему решению может проводиться оперативно, то установку параметра для запроса оптимальнее делать так:

Запрос.УстановитьПараметр("МоментВремени", ?(РежимПроведения=РежимПроведенияДокумента.Оперативный, 
Неопределено
, МоментВремени()));

 


 9. Списание себестоимости по партиям, наиболее часто в том или ином варианте встречается при решении задач оперативного учета, бухгалерского тоже. Управляемая блокировка должна располагаться до получения данных запросом. Саму блокировку приведу ниже. Важный момент, сортировка при получении выборки, должна производиться по моменту времени, не по дате, и тем более не по ссылке. 

Движения.ОстаткиНоменклатуры.Записать();
Движения.Продажи.Записать();

Движения.ОстаткиНоменклатуры.Записывать = Истина;
Движения.Продажи.Записывать = Истина;

// ТУТ НЕОБХОДИМА УПРАВЛЯЕМАЯ БЛОКИРОВКА

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

 

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

Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");
ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");	
Блокировка.Заблокировать();

 

БУХГАЛТЕРСКИЙ УЧЕТ

 

11. Правильная организация процедуры ПередЗаписью документа РучнаяОперация, который необходимо реализовывать в любой задаче по бухгалтерскому учету. Процедура, разумеется, модуля объекта документа. Так же стоит помнить, что документу необходимо запретить проведение. 

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

Проводки = Движения.Управленческий;
Проводки.Записывать = Истина;
Если НЕ Проводки.Модифицированность() И НЕ ЭтоНовый() Тогда
           Проводки.Прочитать();
КонецЕсли;

Для каждого Проводка Из Проводки Цикл
           Проводка.Период = Дата;

 Если НЕ ЭтоНовый() И ПометкаУдаления <> Ссылка.ПометкаУдаления Тогда
                     Проводка.Активность = НЕ ПометкаУдаления;
 КонецЕсли;

КонецЦикла;

КонецПроцедуры

 

12. Управляемая транзакционная блокировка регистра бухгалтерии. 

Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий");
ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары);
ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура, "Номенклатура");	
Блокировка.Заблокировать();

 13. Т.к. в разрабатываемой вами конфигурации присутствие документа РучнаяОперация является обязательным,это накладывает неявное, но обязательное требование - во всех запросах и отчетах, которые вы делаете для решения задачи, накладывать максимальное количество уточняющих условий на счета. К примеру, если в условии вашей задачи упомянуто, что  документ приходная делает проводку Дт Товары - Кт Поставщики, а расходная - Дт ПрибылиУбытки Кт Товары то анализируя потом для какой-либо цели (зависит от задачи) всю эту ситуацию, удобно использовать таблицу Обороты, задавая условие счета равное счету Товары,а на выходе дебетовый оборот будет со счетом Поставщики, а кредитовый - ПрибылиУбытки. Но в условии виртуальной таблицы обязательно нужно указать условие, приведенное ниже, и тогда РучнаяОперация, какая бы корреспонденция счетов там ни была введена, не сможет нарушить работу вашего запроса:

| КорСчет В (Значение(ПланСчетов.Управленческий.Поставщики), Значение(ПланСчетов.Управленческий.ПрибылиУбытки))

 

ПЕРИОДИЧЕСКИЕ РАСЧЕТЫ

 

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

Процедура ПроизвестиРасчетНабора(НаборЗаписей) Экспорт
	
	Регистратор = НаборЗаписей.Отбор.Регистратор.Значение;
	
	Измерения = Новый Массив;
	Измерения.Добавить("Сотрудник");
	Измерения.Добавить("Подразделение");
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Регистратор", Регистратор);
	Запрос.УстановитьПараметр("Измерения", Измерения);
	
	///////////////////////////////
	// ПОВТОРЯЕМЫЙ БЛОК
	ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад;
	Если НаборЗаписей.ПроверитьНаличиеВидаРасчета(ВидРасчета) Тогда
	
		Запрос.УстановитьПараметр("ВидРасчета", ВидРасчета);		
		
		Запрос.Текст = ""; // ТЕКСТ ЗАПРОСА ДЛЯ КОНКРЕТНОГО ВИДА РАСЧЕТА
		
		Выборка = Запрос.Выполнить().Выбрать();
		
		Для каждого Запись Из НаборЗаписей Цикл
		
			Если Запись.ВидРасчета <> ВидРасчета Тогда
				Продолжить;
			КонецЕсли;
			
			Выборка.Сбросить();
			Если Выборка.НайтиСледующий(Запись.НомерСтроки, "НомерСтроки") Тогда			
				Запись.Результат = 0; // ФОРМУЛА ДЛЯ РАСЧЕТА
			КонецЕсли;
		КонецЦикла;
		
	КонецЕсли;
	///////////////////////////////
	
	НаборЗаписей.Записать(, Истина);
	
	
	// ПОВТОРЯЕМЫЙ БЛОК
	
	НаборЗаписей.Записать(, Истина);
	
	
	// ПОВТОРЯЕМЫЙ БЛОК
	
	НаборЗаписей.Записать(, Истина);	
	
КонецПроцедуры

 Функцию "ПроверитьНаличиеВидаРасчета" имеет смысл разместить в каждом регистре в модуле набора записей. Тогда повторяемые блоки будут универсальными. Сама функция имеет следующий вид:

Функция ПроверитьНаличиеВидаРасчета(ВидРасчета) Экспорт	
	Возврат ?(ЭтотОбъект.ВыгрузитьКолонку("ВидРасчета").Найти(ВидРасчета)=Неопределено,Ложь,Истина);	
КонецФункции


 15.  Заполнение сторно записей для набора записей регистра расчета.

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

16. Разбитие оклада при многократном изменении его значения внутри периода расчета. Вариант получения разбивки прямо в запросе. 

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

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

 

17. Разбитие на периоды на границе месяца при еженедельных начислениях, прямо в запросе. Часто встречаются задачи с еженедельными начислениями, одна из особенностей в этом случае - переход через месяц в пределах одной недели. В этом случае нужно получить две записи регистра расчета, соответствуюх одной записи документа. 

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

 

18. "Обеспечить пользователю возможность редактировать результат расчета прямо в документе" - такое условие тоже встречается нередко. В этом случае в форме документа размещается кнопка "Расчет", которая и производит весь расчет. Вариант процедуры модуля формы ниже:

ОбъектСервер = РеквизитФормыВЗначение("Объект");
ОбъектСервер.СформироватьДвиженияДокумента();
	
Расчет.ПроизвестиРасчетНабора(ОбъектСервер.Движения.ОсновныеНачисления);
Расчет.ПроизвестиРасчетНабора(ОбъектСервер.Движения.ДополнительныеНачисления);
	
ОбъектСервер.ОсновныеНачисления.Загрузить(ОбъектСервер.Движения.ОсновныеНачисления.Выгрузить());
ОбъектСервер.ДополнительныеНачисления.Загрузить(ОбъектСервер.Движения.ДополнительныеНачисления.Выгрузить());
	
ОбъектСервер.Движения.ОсновныеНачисления.Очистить();
ОбъектСервер.Движения.ОсновныеНачисления.Записать();
ОбъектСервер.Движения.ДополнительныеНачисления.Очистить();
ОбъектСервер.Движения.ДополнительныеНачисления.Записать();	
	
ЗначениеВРеквизитФормы(ОбъектСервер,"Объект");

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

 

 19. Перерасчет только тех записей набора, которые требуют перерасчета. Такое условие есть в нескольких задачах и чтобы его обработать, необходимо процедуру расчета (в моих примерах это ПроизвестиРасчетНабора) модифицировать, чтобы она учитывала переданный второй параметр, НомерСтроки. В случае, если номер строки отличается от Неопределено, процедура должна перерасчитывать только ту запись, номер которой в нее попал. Запрос для связки записей перерасчета с записями регистра, для получения номера строки, ниже:

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

 

20. Заполнение диаграммы Ганта. 

 

// ЗАПРОС ПО ФАКТИЧЕСКОМУ ПЕРИОДУ ДЕЙСТВИЯ
Диаграмма.Обновление = Ложь;
Диаграмма.Очистить();	
Пока Выборка.Следующий() Цикл
              Серия = Диаграмма.УстановитьСерию(Выборка.Сотрудник);
	Точка = Диаграмма.УстановитьТочку(Выборка.ВидРасчета);
	ТекущееЗначение = Диаграмма.ПолучитьЗначение(Точка,Серия);		
	Интервал = ТекущееЗначение.Добавить();
	Интервал.Начало = Выборка.ПериодДействияНачало;
	Интервал.Конец  = Выборка.ПериодДействияКонец;
КонецЦикла; 	
Диаграмма.Обновление = Истина;

20. И последнее, но тоже важное. Наиболее оптимальное по соотношению "затраченное время - результат" изменение обработки ЗаполнениеГрафика. В реальной жизни так делать было бы ошибкой, но т.к. вы на экзамене, и перезаполнять данные разных годов, сохраняя предыдущие значения, вам врядли понадобится, имейте ввиду три действия ниже:

Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни, ГрафикРаботы) Экспорт 

Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей();
Набор.Отбор.ГрафикРаботы.Установить(ГрафикРаботы); // 1. ДОБАВЛЯЕМ ОТБОР ПО ГРАФИКУ
//Набор.Прочитать(); // 2. КОММЕНТИРУЕМ ЧТЕНИЕ НАБОРА

ЧислоСекундВСутках = 86400;

Дат = ДатаНачала;
Для к = 0 По Набор.Количество()-1 Цикл

Запись = Набор[к];
Если Запись.Дата < ДатаНачала Тогда
    Продолжить;
ИначеЕсли Запись.Дата =Дат Тогда
Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда
Запись.Значение = 0;
Иначе          
Запись.Значение = 8;
КонецЕсли;
Дат = Дат + ЧислоСекундВСутках;
Иначе
Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл
НоваяЗапись = Набор.Добавить();
НоваяЗапись.Дата = Дат;
Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда
НоваяЗапись.Значение = 0;
Иначе          
НоваяЗапись.Значение = 8;
КонецЕсли; 
Дат = Дат + ЧислоСекундВСутках;
КонецЦикла; 
Если Запись.Дата > ДатаОкончания Тогда
Прервать;
Иначе
Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда
Запись.Значение = 0;
Иначе          
Запись.Значение = 8;
КонецЕсли;
КонецЕсли;
Дат = Дат + ЧислоСекундВСутках;
КонецЕсли; 
КонецЦикла;
Набор.Записать();

Пока Дат <= ДатаОкончания Цикл
Запись = Набор.Добавить();
Запись.ГрафикРаботы = ГрафикРаботы; // 3. ВСТАВЛЯЕМ НУЖНЫЙ ГРАФИК
Запись.Дата = Дат;
Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда
Запись.Значение = 0;
Иначе          
Запись.Значение = 8;
КонецЕсли; 
Дат = Дат + ЧислоСекундВСутках;
КонецЦикла; 
Набор.Записать();

КонецПроцедуры

См. также

Подписаться Добавить вознаграждение
Комментарии
0. correct_coding (correct_coding) 01.01.70 03:00
Перед сдачей экзамена начитался в интернете мнений и отзывов, что времени на решение отведено очень мало (а это 4 часа) и что хватает только набить код и чуток отладить. После сдачи с этой точкой зрения не согласен, времени достаточно если вы быстро печатаете и быстро думаете=) Однако в процессе подготовки в голове волей-неволей складывался небольшой набор действий по оптимизации расхода времени и набор часто встречающихся механизмов, присутствующих, в той или иной модификации, в большинстве задач.

Перейти к публикации

1. Алексей Новиков (Новиков) 20.12.11 17:57
Молодец! Хорошая информация. Но, инфа кажется не полной без:

1. Когда сам сдавал?
2. С какого раза сдал?
3. На курсы какие-нибудь ходил или тренинги?
4. Сколько времени убито на подготовку?
5. Ну и конечно, пруфлинки на ресурсы, которые помогли!

Статьи такие уважаю!
samadov; Open-BS; quNas; Pechenuych_ka; Mixmaister; +5 Ответить
2. Михаил Ражиков (tango) 20.12.11 18:36
автор мегамонстр +++
sulfur17; +1 Ответить
3. Андрей (andru_dv) 21.12.11 00:45
Да, полезная информация для сдачи зачета.
Спасибо!
4. tslk tslk (tslk) 21.12.11 05:08
В пункте 6 по моему ошибочка :

Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Количество() Тогда
-------------------------^
Отказ = Истина;
КонецЕсли;
5. Сергей (svsource) 21.12.11 08:33
В общем ходил я на все курсы, тренинги по 8.2. За все сам платил. Хочу сказать что Вы молодец. Все что написано - по делу исключительно. Замечания АБСОЛЮТНО правильные. 5+ Вам. Сейчас как раз решаю задачи на время из СПЕЦА 8.2 по платформе. Планирую до майских обязательно сдать. То, что Вы написали - БУКВАЛЬНО то, что нам Гончаров Дмитрий, Козырев Дмитрий и т.д. на курсах несколько раз повторяли. Народ в 1С (преподаватели) все ПРАКТИКУЮЩИЕ СПЕЦЫ. Втереть им лажу не прокатит. Я хотел после курсов сразу пойти сдавать, Но Дмитрий Гончаров мой пыл охладил. Решать то я решаю задачи - но сейчас особенно!!!! требование решить АКАДЕМИЧЕСКИ ПРАВИЛЬНО, а не только чтоб работало :) Полно примеров, когда все работает - но ставят 2. Народ обижается конечно - у меня друг на 4-ый круг пошел. Очень требуют чтоб задания были решены с учетом специфики именно платформы 8.2 и обязательно работали в тонком клиенте! Все что Вы написали - еще раз говорю - ПРАВИЛЬНО и АКТУАЛЬНО!!! Очень полезно для сдающих Спеца по платформе 8.2. С Уважением, Сергей.
sulfur17; 1С-Учебный Центр №3; +2 Ответить 1
6. evgen1977 (musatov1c.ru) 21.12.11 08:42
Очень интересно. Просмотрел пока мельком. Оставляю как закладку для изучения. Требуется еще время для специалиста. :)
7. Павел Паршин (pparshin) 21.12.11 09:00
Замечательно! По делу и без воды.

У меня три вопроса.
1.в сети валяется управляемая консоль запросов
Какая сеть имеется ввиду?
2.откройте блокнот, и создайте себе несколько заготовок
Подразумевается блокнот, который Notepad?
3.За какое время до начала экзамена можно приходить?
8. Семен Слепаков (sa1m0nn) 21.12.11 09:10
Спасибо, в мемориз. 2 раза уже лажанулся именно по причине нехватки времени, в январе на третий заход.
9. Alexey Pak (Alexey55) 21.12.11 10:17
Спасибо! очень полезная информация
10. Dragon Ago (DragonAgo) 21.12.11 10:52
Вот бы знать, как же правильно решить ту или иную задачу, в книгах и то не расписывается конкретика, все в основном либо сам достигаешь либо из форумов...Хоть и получается успешно изменять конфигурации, типовые отчеты, но до сих пор понимаю я ничего не знаю
sulfur17; +1 Ответить
11. Dragon Ago (DragonAgo) 21.12.11 10:52
Хорошая статья!!!Автору риспект
12. igor sarafanov (ms200999) 21.12.11 11:58
Вот действительно достойная работа. Побольше бы подобных публикаций.
sulfur17; +1 Ответить
13. Лика Цветочная (progr21) 21.12.11 13:47
Спасибо автору за щедрость, за то, что поделился свои опытом! Не только сам сдал, но и подумал о других сдающих, которым предстоит пройти этот же путь. Очень толковая публикация.
14. Анна Омеляненко (dell_anna) 21.12.11 14:09
Хорошая статья! Спасибо за проделанную работу! И все таки можете ответить на вопрос:
1. За какое время до экзамена можно прийти?
2. Сразу пускают в кабинет, чтобы например проделать все необходимые манипуляции (подготовки)?
15. no_registration no_registration (no_registration) 21.12.11 19:11
16. Программулькин (Программулькин) 22.12.11 06:32
Хорошая статья. Нужная,актуальная. Вот ещё бы ответы автора на заданные тут вопросы получить, было бы вообще чудненько.
17. F1_1 (F1_1) 22.12.11 09:17
Согласен с практически со всем комментраиями. Очень нужная статья. И как раз вовремя - решился на сдачу. Готовлюсь. Особенно нужным кажется высказывание про "АКАДЕМИЧЕСКИ ПРАВИЛЬНЫМ".
Автору - большое спасибо.
18. Дандронтий Крузенштерн (dandrontiy) 22.12.11 10:50
Автору реальный респект! Если бы автор сего поста составил список правильных Академически решений по темам (не все билеты, а сам подход, видно что автор именно концептуально подходит к вопросу, что очень ценно) такую работу и за деньги было бы не грех приобрести! Труд проделанный им - очень полезен, готов так сказать оформить подписку на методические статьи...
20. Александр Иванов (dkprim) 22.12.11 15:11
невероятно полезная статья. краткость - сестра таланта. автору спасибо :)
21. Дмитрий Ярославцев (DimanYa) 23.12.11 07:22
Где вы были месяц назад? =) А та прибавлю свои 5 копеек. Дома обязательно попытайтесь сделать один билет на время. Это кажется, что 4 часа, что даётся на экзамен это много. А когда начинаешь делать там, то времени жутко не хватает. И не забывайте сохраняться. У меня на сдаче вылетела 1с и я потерял 25 минут работы.
22. Престиж Полякова (prestige) 23.12.11 16:03
Спасибо, написано умно, полезно и "академически правильно";)
23. Александр М (Fruit83) 25.12.11 13:23
Спасибо! понадобится в подготовке!
24. Thang Tran (thang_madi) 26.12.11 10:07
25. Гость 27.12.11 22:39
Спасибо большое за подробное описание и полезные реальные рекомендации. Ну очень бы хотелось получить от автора ответы на заданные в комментариях вопросы. Планирую сдавать спеца, хотелось бы оценить шансы и заложить время на подготовку. Еще раз спасибо.
26. EfiopReal (Созинов) 30.12.11 10:25
Автору плюс. Как было сказано выше, неплохо было бы добавить пруфлинки на ресурсы, которые помогли в подготовке.
27. Zigfridish (Bassgood) 07.01.12 01:49
(0) Хотел бы задать автору статьи некоторые вопросы и предложить внести некоторые изменения в ее содержание с целью более полного обзора:
1. Поясните почему нужно применить именно управляемый, а не автоматический режим управления блокировками?
6.1. Можно было бы дописать, что новая методика проведения заключается в том, что сначала записываются движения документа по соответствующему регистру, а затем уже производится проверка на наличие в регистре отрицательных остатков. И сказать что таких задач, в которых применяется новая методика проведения, небольшой процент - мне кажется ошибочно, она применяется в задачах, требующих контроль остатков, а таковыми являются практически все задачи по оперативному учету, в которых происходит списание товаров.
6.2. Почему мы применили свойство набора записей БлокироватьДляИзменения, а не использовали управляемые транзакционные блокировки, как это было сделано в последующих примерах?
6.3. В запросе в качестве параметра не указана ссылка на документ, из которого выбираются товары и помещаются в "втДанныеДокумента".
6.4. Ошибка в выборке запроса: "Если Выборка.Количество() Тогда"
7. А почему вместо этого нельзя просто использовать округление (функция Окр())?
8. Здесь можно добавить, что это сделано с целью увеличения скорости исполнения запроса, т.к. получение текущих остатков (актуальных, что соответствует методике оперативного проведения) производится быстрее, нежели на какой-либо другой момент времени.
sulfur17; Rustig; +2 Ответить
28. Игорь Юртаев (ipyu) 13.01.12 23:13
Огромное спасибо за очень подробную и полезную информацию.
29. Uncore1989 (Uncore) 14.01.12 08:18
Очень полезная информация. Автору +1
30. VictorK (VictorK) 22.02.12 21:24
Очень ценная информация для подготовки к экзамену, раньше такой информации не найти было! Жаль, что не все готовы делиться такой информацией. Спасибо!!!!!
31. Ay Bv (Flashill) 25.02.12 14:55
1. В свойствах конфигурации режим управления блокировками намеренно установлен в автоматический, хотя нужно управляемый. Это необходимо исправить сразу, т.к. по мере решения вы можете насоздавать объектов с неверно установленным режимом управления блокировками, чем позже вы это заметите, тем больше потом исправлять. А если не заметите вовсе, могут "штрафануть".


На сколько я помню из вопросов на 1С: Профессионала по платформе 8.2, то
"Управляемый" и "Автоматический" - эти режимы принудительно включают выбранный способ управления блокировками. Т.е. не важно какой способ поставился во всех новых созданных объектах. Если в свойствах самой конфигурации стоит "Управляемый" - то он будет привилегированным, автоматического не будет.
А вот если поставить "Автоматический и управляемый", то тогда действительно придется править режим блокировок во всех объектах.

sulfur17; +1 Ответить
32. Sanec_GAL (Sanek_GAL) 25.02.12 15:34
Спасибо! Очень полезная информация.
33. Дмитрий (dimk@a) 21.03.12 13:03
Спасибо! Вот это правильный, системный подход! и стимул - времени достаточно, нужно только знать как им распорядиться.
34. IR IR (Artemuch2) 21.03.12 15:20
Доброе время суток! по своему опыту знаю что с первого раза сдать не получится точно - это раз. если ты не делал такое же задание то не успеешь ну или мегабыстрый программист- это два. на задании нужно решать только поставленную задачу и не отвлекаться ни на какие красивости- это три. ну и настроение преподавателя-это четыре
35. Александр Гуляев (gavrikprog) 28.03.12 18:53
Кто знает, в терминале при сдаче дистанционно буфер обмена работает ?

т.е. я пишу код локально, потом зашел в терминал и время пошло. А тот код кот. писал локально скопировал в терминал.
36. ris83 (ris83) 05.04.12 10:21
"Если Выборка.Количество() Тогда"

Никакой тут ошибки нет...вспомните неявное преобразование типов! Число преобразуется в булево по принципу 0-ложь, а все что больше в истину...Поэтому если результат запроса пустой то будет преобразовано в ЛОЖЬ. а если хоть одна или больше записей то будет ИСТИНА
vitaliy1911; timeforlive; veretennikoff; Olenevod; igor-pn; RailMen; Rustig; +7 Ответить
37. cmd_vasec (cmd_vasec) 05.04.12 10:58
Спасибо. Отличная статья.
38. LivingStar (L&S) (LivingStar) 22.04.12 16:22
а не верно ли получать учетную политику следующим образом?
|
// 1). Получение учетной политики ->
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| УчетнаяПолитикаСрезПоследних.Период,
| УчетнаяПолитикаСрезПоследних.МетодСписания
|ИЗ
| РегистрСведений.УчетнаяПолитика.СрезПоследних(, ГОД(период) = &Год) КАК УчетнаяПолитикаСрезПоследних";
Запрос.УстановитьПараметр("Год",Год(ТекущаяДата()));
Рез = Запрос.Выполнить().Выбрать();
Рез.Следующий();
УчетнаяПолитика = Рез.МетодСписания;
Если Не ЗначениеЗаполнено(УчетнаяПолитика) Тогда
Сообщить("Не заполнена учетная политика на " + Формат(ТекущаяДата(), "ДФ=""гггг""") + " год!");
Возврат;
КонецЕсли;
39. Дмитрий Баранов (Sunhare) 11.05.12 14:11
40. Жанар Мухамеджанова (lolidy) 18.05.12 06:55
Спасибо большое! Очень полезная статья, скоро иду сдавать, очень пригодятся эти советы.
41. vladal (Vladal) 25.06.12 13:09
Статью прочитал "по диагонали", но радует описание, а не тупая копипаста в док-файл, который надо скачать.
42. Максим Кузнецов (MakcTLT63) 13.07.12 06:30
не ну круто конечно, наверное..
но, после такого заполнения значений, дальше читать уже не хочется

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

И еще.. писать такую конструкцию ?(3=3,10, Окр(4/3,2)*10), да и вообще весь 7 пункт - это что-то за гранью добра и зла..
43. MagIvan (RailMen) 04.09.12 21:55
44. Lena Denysuyk (Pechenuych_ka) 11.02.13 19:24
45. Елена Пименова (Bukaska) 11.02.13 20:36
Хорошая статья, но поясните разницу между этим:
Запись = Движения.ТоварыНаСкладах.ДобавитьРасход();
И этим:
Запись = Движения.ТоварыНаСкладах.Добавить()
Запись.ВидДвижения = ВидДвиженияНакопления.Расход()
Почему то в питере преподаватели рекомендуют все вариант ниже.
46. Евгения Алекс (1С-Учебный Центр №3) 14.03.13 18:56
(5) svsource,
То, что Вы написали - БУКВАЛЬНО то, что нам Гончаров Дмитрий, Козырев Дмитрий и т.д. на курсах несколько раз повторяли. Народ в 1С (преподаватели) все ПРАКТИКУЮЩИЕ СПЕЦЫ. Втереть им лажу не прокатит. Я хотел после курсов сразу пойти сдавать, Но Дмитрий Гончаров мой пыл охладил. Решать то я решаю задачи - но сейчас особенно!!!! требование решить АКАДЕМИЧЕСКИ ПРАВИЛЬНО, а не только чтоб работало :)

Спасибо за то, что выбираете наши курсы! Надеемся, что они действительно помогают.
Хочется обратить внимание на то, что наш учебный центр запустил новый проект WEB-обучение. Курсов уже много (http://www.1c-uc3.ru/web_obuchenie.html), но в контексте данной темы (про подготовку к экзамену) особо полезен WEB-курс "Решение задачи, схожей с задачей экзамена 1С:Специалист по платформе 1С:Предприятие 8.2". Автор и ведущий - сам Дмитрий Гончаров. Более подробная информация здесь: http://www.1c-uc3.ru/web-specv8.html
47. Вадим Мананников (manan) 27.03.13 22:19
Вот здесь http://infostart.ru/public/66244/ решения более 100 задач из актуального"Сборника задач для подготовки к экзамену "1С:Специалист" по платформе "1С:Предприятие 8". Версия 8.2 (артикул 4601546078247)" (редакция 3, 2011 год)
sulfur17; +1 Ответить
48. Graf Cash (Graf_Cash) 21.05.13 11:33
Очень много полезной информации в одном месте.
Коротко и по-делу. Спасибо
49. Alex (Limas) 27.06.13 12:01
Если бы эта статья мне попалась до сдачи спеца по платформе, думаю сдал бы с первого, а не с пятого раза :))) насчет четырех часов их было действительно очень мало, т.к писать нужно правильно сразу, времени на выбор варианта, оптимизацию, поиск ошибок и отладку нету, недаром ведь время сдачи увеличили до 5 часов.
50. valex1c (valex1c) 06.08.13 16:35
51. Игорь Соколов (Yav4ik) 07.08.13 11:39
Интеренсая статья, спасибо!
52. Andrey Andriyashin (andr_andrey) 14.01.14 12:07
7 пункт, с округлением до 2 знаков результата деления, без пояснения - вредный совет.
53. Алексей Шарапов (Isperator) 18.04.14 13:18
Статья хорошая, но сейчас сдают на Платформе 8.3. Кто нибудь может освежить информацию? Заранее спасибо.
54. Ольга Немешева (kn) 18.04.14 13:52
(53)А что новые билеты на Спеца по 8.3 или просто на другой платформе?
55. Елена Пименова (Bukaska) 18.04.14 14:47
(54) kn, Ничего пока что не меняется.. главное чтобы работал интерфейс Такси.. то есть если на 8.2 важен был тонкий клиент, то для 8.3 надо чтобы работало в интерфейсе такси)
sulfur17; 1С-Учебный Центр №3; +2 Ответить 1
56. Ольга Немешева (kn) 18.04.14 15:06
57. Алексей Шарапов (Isperator) 23.04.14 15:06
(54) kn, Звонил в 1С обещают сборник задач по 8.3 в конце мая. Изменятся ли задачи полностью или частично мне не ответили.
1С-Учебный Центр №3; +1 Ответить 1
58. Ольга Немешева (kn) 23.04.14 17:33
Спасибо, встречалась такая информация тоже, теперь значит точно.
59. Евгения Алекс (1С-Учебный Центр №3) 23.04.14 17:42
(57) Isperator, Принципиальных изменений нет, но формулировки немного изменились.

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

Изменены требования к интерфейсу, теперь это обязательно Такси.

Изменился технический принцип компоновки задач.
Задача на экзамене будет собираться случайным образом из заранее подготовленных фрагментов.
60. Евгения Алекс (1С-Учебный Центр №3) 21.05.14 18:26
Приглашаем на однодневный мастер-класс "Решение сквозной задачи с использованием платформы "1С:Предприятие 8" для подготовки к экзамену 1С:Специалист по платформе "1С:Предприятие 8", который состоится 29 мая 2014 г. :)
61. Алексей Шарапов (Isperator) 22.05.14 12:58
(60) 1С-Учебный Центр №3, Не подскажите, новый сборник задач вышел?
62. Елена Пименова (Bukaska) 22.05.14 13:09
63. Евгения Алекс (1С-Учебный Центр №3) 22.05.14 13:11
(61) Isperator, на данный момент сборник по 8.3 еще не вышел, ждем информационного письма от 1С
64. Алексей Шарапов (Isperator) 26.05.14 13:10
(63) 1С-Учебный Центр №3, Спасибо за информацию.
65. mikhailovaew (mikhailovaew) 29.05.14 12:41
Не совсем понятно с проблемой копеек:
НоваяЗапись.Сумма = ?(Выборка.КоличествоДокумент = Выборка.КоличествоОстаток, Выборка.СуммаОстаток,
Окр(Выборка.КоличествоДокумент / Выборка.КоличествоОстаток,2) * Выборка.СуммаОстаток);

Зачем мы тут округляем? Платформа сама при записи в регистр сделает округление до точности ресурса. Или тут есть какая-то методологическая тонкость? Поясните, пожалуйста.
66. Алексей Рожнятовский (spetzpozh) 24.07.14 23:54
(65) mikhailovaew, округлять не обязательно, проблема копеек в том, что есть требование - при списании всего товара списывать оставшуюся себестоимость. Хотя не очень понятно, как проблема копеек может вылезти при расчете (КоличествоСписываю)/(КоличествоОсталось)*Стоимость. Ну да 1С хочет как в статье.
67. mikhailovaew (mikhailovaew) 08.08.14 14:45
(66) spetzpozh, конструкция ?(Выборка.КоличествоДокумент = Выборка.КоличествоОстаток, Выборка.СуммаОстаток, <...ДругаяСуммаРассчитннаяОтКоличества..>) мне понятна, чтобы при выбирании остатка количества выбрать всю оставшуюся сумму.
Мне не понятно, зачем делать именно округление при расчете <...ДругойСуммыРассчитннойОтКоличества..>, оно дальше в расчетах не участвует (не влияет на получение других сумм), а при записи в регистр само округлится.
68. Павел Соловьев (Astrey1C) 19.09.14 13:39
Отличная статья. Автору 5+.
69. Фёдор (Tedman) 24.10.14 15:58
Есть небольшое замечание в части
Разбитие оклада при многократном изменении его значения внутри периода расчета. Вариант получения разбивки прямо в запросе.

Запрос для разбиения строк документа в зависимости от оклада, как мне кажется, выглядит несколько сложнее.
Исходная задача:
Есть оклад на 31.12.2013 - 10 000. Оклад менялся 10.01 и 20.01.
Начисляем январь: с 01.01 по **.01 запрос отлично отрабатывает. Строка дробится на то количество частей, сколько раз у нас менялся оклад.
А вот если наш сотрудник пил после праздников, и на работу вышел только с 15.01. Тогда ваш запрос выдаст следующее:
Сотрудник	Подразделение	ВидРасчета	Оклад	ПериодДействияНачало	ПериодДействияКонец
Бельдыев	Бухгалтерия	Оклад	12 000	15.01.2014 0:00:00	19.01.2014 23:59:59
Бельдыев	Бухгалтерия	Оклад	10 000	15.01.2014 0:00:00	09.01.2014 23:59:59
Бельдыев	Бухгалтерия	Оклад	15 000	20.01.2014 0:00:00	31.01.2014 23:59:59

А это не правильно... Смысл в том, что использовать СрезПоследних на ДатуРегистрации или на НачалоМесяца(***) нельзя, т.к. совсем не факт, что начисление будет происходить с первого числа месяца, и что оклад не изменится с начала месяца до нашего первого дня начисления, поэтому СрезПоследних надо "симулировать" самим.
Я в итоге родил следующее:
ВЫБРАТЬ
	НачислениеЗарплатыОсновныеНачисления.Сотрудник,
	НачислениеЗарплатыОсновныеНачисления.Подразделение,
	НачислениеЗарплатыОсновныеНачисления.ДатаНачала,
	НачислениеЗарплатыОсновныеНачисления.ДатаОкончания,
	НачислениеЗарплатыОсновныеНачисления.ВидРасчета,
	ЗНАЧЕНИЕ(Справочник.ГрафикиРаботы.Пятидневка) КАК ГрафикРаботы
ПОМЕСТИТЬ втДок
ИЗ
	Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления
ГДЕ
	НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
	СведенияОСотрудниках.Период,
	СведенияОСотрудниках.Сотрудник,
	СведенияОСотрудниках.Подразделение,
	СведенияОСотрудниках.Оклад,
	втДок.ГрафикРаботы
ПОМЕСТИТЬ Оклады
ИЗ
	втДок КАК втДок
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках КАК СведенияОСотрудниках
		ПО втДок.Сотрудник = СведенияОСотрудниках.Сотрудник
			И втДок.Подразделение = СведенияОСотрудниках.Подразделение
ГДЕ
	втДок.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Оклад)
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	втДок.Сотрудник,
	втДок.Подразделение,
	втДок.ДатаНачала,
	втДок.ДатаОкончания,
	МАКСИМУМ(Оклады.Период) КАК Период,
	втДок.ГрафикРаботы
ПОМЕСТИТЬ втДокСПериодомНачОкл
ИЗ
	втДок КАК втДок
		ЛЕВОЕ СОЕДИНЕНИЕ Оклады КАК Оклады
		ПО втДок.Сотрудник = Оклады.Сотрудник
			И втДок.Подразделение = Оклады.Подразделение
			И втДок.ДатаНачала >= Оклады.Период
ГДЕ
	втДок.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Оклад)

СГРУППИРОВАТЬ ПО
	втДок.ДатаНачала,
	втДок.ДатаОкончания,
	втДок.Подразделение,
	втДок.Сотрудник,
	втДок.ГрафикРаботы
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	втДокСПериодомНачОкл.Сотрудник,
	втДокСПериодомНачОкл.Подразделение,
	втДокСПериодомНачОкл.ДатаНачала,
	втДокСПериодомНачОкл.ДатаОкончания,
	втДокСПериодомНачОкл.Период,
	НачОклады.Оклад,
	втДокСПериодомНачОкл.ГрафикРаботы
ПОМЕСТИТЬ втДокСНачОкл
ИЗ
	втДокСПериодомНачОкл КАК втДокСПериодомНачОкл
		ЛЕВОЕ СОЕДИНЕНИЕ Оклады КАК НачОклады
		ПО втДокСПериодомНачОкл.Сотрудник = НачОклады.Сотрудник
			И втДокСПериодомНачОкл.Подразделение = НачОклады.Подразделение
			И втДокСПериодомНачОкл.Период = НачОклады.Период
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	втДокСНачОкл.Сотрудник,
	втДокСНачОкл.Подразделение,
	втДокСНачОкл.ДатаНачала,
	втДокСНачОкл.ДатаОкончания,
	втДокСНачОкл.Период,
	втДокСНачОкл.Оклад КАК Оклад,
	Оклады.Оклад КАК ОкладРазрез,
	Оклады.Период КАК ПериодРазрез,
	втДокСНачОкл.ГрафикРаботы
ПОМЕСТИТЬ втДокПодготовкаКРазбивке
ИЗ
	втДокСНачОкл КАК втДокСНачОкл
		ЛЕВОЕ СОЕДИНЕНИЕ Оклады КАК Оклады
		ПО втДокСНачОкл.Сотрудник = Оклады.Сотрудник
			И втДокСНачОкл.Подразделение = Оклады.Подразделение
			И втДокСНачОкл.ДатаНачала < Оклады.Период
			И втДокСНачОкл.ДатаОкончания > Оклады.Период
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	втДокПодготовкаКРазбивке.Сотрудник,
	втДокПодготовкаКРазбивке.Подразделение,
	втДокПодготовкаКРазбивке.ДатаНачала,
	ДОБАВИТЬКДАТЕ(втДокПодготовкаКРазбивке.ПериодРазрез, ДЕНЬ, -1) КАК ДатаОкончания,
	втДокПодготовкаКРазбивке.Оклад,
	втДокПодготовкаКРазбивке.ГрафикРаботы
ПОМЕСТИТЬ ОкладДанные
ИЗ
	втДокПодготовкаКРазбивке КАК втДокПодготовкаКРазбивке
ГДЕ
	НЕ втДокПодготовкаКРазбивке.ПериодРазрез ЕСТЬ NULL 

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

ВЫБРАТЬ
	втДокПодготовкаКРазбивке.Сотрудник,
	втДокПодготовкаКРазбивке.Подразделение,
	втДокПодготовкаКРазбивке.ДатаНачала,
	втДокПодготовкаКРазбивке.ДатаОкончания,
	втДокПодготовкаКРазбивке.Оклад,
	втДокПодготовкаКРазбивке.ГрафикРаботы
ИЗ
	втДокПодготовкаКРазбивке КАК втДокПодготовкаКРазбивке
ГДЕ
	втДокПодготовкаКРазбивке.ПериодРазрез ЕСТЬ NULL 

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

ВЫБРАТЬ
	втДокПодготовкаКРазбивке.Сотрудник,
	втДокПодготовкаКРазбивке.Подразделение,
	втДокПодготовкаКРазбивке.ПериодРазрез,
	втДокПодготовкаКРазбивке.ДатаОкончания,
	втДокПодготовкаКРазбивке.ОкладРазрез,
	втДокПодготовкаКРазбивке.ГрафикРаботы
ИЗ
	втДокПодготовкаКРазбивке КАК втДокПодготовкаКРазбивке
ГДЕ
	НЕ втДокПодготовкаКРазбивке.ПериодРазрез ЕСТЬ NULL 
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ОкладДанные.Сотрудник,
	ОкладДанные.Подразделение,
	ОкладДанные.ДатаНачала КАК ДатаНачала,
	ОкладДанные.ДатаОкончания,
	ОкладДанные.Оклад,
	ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Оклад) КАК ВидРасчета,
	ОкладДанные.ГрафикРаботы КАК ГрафикРаботы
ИЗ
	ОкладДанные КАК ОкладДанные

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

ВЫБРАТЬ
	втДок.Сотрудник,
	втДок.Подразделение,
	втДок.ДатаНачала,
	втДок.ДатаОкончания,
	NULL,
	втДок.ВидРасчета,
	втДок.ГрафикРаботы
ИЗ
	втДок КАК втДок
ГДЕ
	втДок.ВидРасчета <> ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Оклад)

УПОРЯДОЧИТЬ ПО
	ДатаНачала
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	НачислениеЗарплатыДополнительныеНачисления.Сотрудник,
	НачислениеЗарплатыДополнительныеНачисления.Подразделение,
	НачислениеЗарплатыДополнительныеНачисления.ВидРасчета,
	НачислениеЗарплатыДополнительныеНачисления.ДатаНачала,
	НачислениеЗарплатыДополнительныеНачисления.ДатаОкончания
ПОМЕСТИТЬ ДопНачисления
ИЗ
	Документ.НачислениеЗарплаты.ДополнительныеНачисления КАК НачислениеЗарплатыДополнительныеНачисления
ГДЕ
	НачислениеЗарплатыДополнительныеНачисления.Ссылка = &Ссылка
;

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

Не даю 100% гарантии, что это правильно, но работает, вроде, правильно при всех вариантах, которые мне удалось придумать.
Хотелось бы услышать мнение "гуру" уже прошедших лёд и пламя, и имеющих заветную жёлтую бумажку.
70. Алексей Шарапов (Isperator) 14.02.15 17:06
Ребята, поделитесь впечатлениями и опытом кто ходил сдавать в 2015 году на экзамен. Готовлюсь к экзамену.
71. Евгений (reg-81) 08.03.15 20:23
Первоначальный запрос работает корректно, нужно только условие вместо "МЕЖДУ" поставить ДатаНачала > &ДатаНачала И ДатаОкончания <= &ДатаОкончания
72. Артем Мартыненко (temamart) 09.04.15 13:37
Проводки = Движения.Управленческий;
Проводки.Записывать = Истина;
Если НЕ Проводки.Модифицированность() И НЕ ЭтоНовый() Тогда
Проводки.Прочитать();
КонецЕсли;

Зачем вот это условие? Проводки же всегда будут модифицированы.
73. Андрей Рогачев (avgyr77) 10.06.15 20:59
Спасибо автору за труд. идем здавать спеца!
74. www witalit (wtlz) 16.06.15 17:37
А вот такой вопрос - как определить при записи набора записей регистра расчета когда надо замещать, а когда нет ? Ну и по ТолькоЗапись такой же вопрос)

РегистрРасчетаНаборЗаписей.<Имя регистра расчета> (CalculationRegisterRecordSet.<Имя регистра расчета>)
Записать (Write)
Синтаксис:
Записать(<Замещать>, <ТолькоЗапись>, <ЗаписьФактическогоПериодаДействия>, <ЗаписьПерерасчетов>)
<Замещать> (необязательный)
Тип: Булево.
Определяет режим замещения существующей записи в соответствии с текущими установками отбора (т.е. по регистратору набора записей). Истина - перед записью существующие записи будут удалены. Ложь - записи будут дописаны к уже существующим в информационной базе записям.
75. Nikky Wolf (DopeDigga) 31.07.15 14:07
(74) wtlz, ну судя по необязательности - то если критично и явно требуется или беречь размер ИБ, или, к примеру, иметь возможность запроситься к истории этих изменений, получается истина / ложь соответственно
76. Алексей Кубовцов (aleksey.kubovtsov) 26.08.15 12:37
Коллеги , прокомментируйте плиз
на экзамен кучу времени убил на запрос в РМ на разбитие периода
вариант :

ВЫБРАТЬ
	НачислениеЗарплатыОсновныеНачисления.НомерСтроки КАК НомерСтроки,
	НачислениеЗарплатыОсновныеНачисления.Сотрудник,
	НачислениеЗарплатыОсновныеНачисления.ВидРасчета,
	НачислениеЗарплатыОсновныеНачисления.ГрафикРаботы,
	НачислениеЗарплатыОсновныеНачисления.ДатаНачала,
	НачислениеЗарплатыОсновныеНачисления.ДатаОкончания,
	СведенияОСотрудниках.Период,
	СведенияОСотрудниках.Оклад
ПОМЕСТИТЬ ВТ_РазбитеПериода
ИЗ
	Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках КАК СведенияОСотрудниках
		ПО НачислениеЗарплатыОсновныеНачисления.Сотрудник = СведенияОСотрудниках.Сотрудник
			И НачислениеЗарплатыОсновныеНачисления.ДатаОкончания >= СведенияОСотрудниках.Период
			И НачислениеЗарплатыОсновныеНачисления.ДатаНачала <= СведенияОСотрудниках.Период
ГДЕ
	НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_РазбитеПериода.НомерСтроки,
	ВТ_РазбитеПериода.Сотрудник,
	ВТ_РазбитеПериода.ВидРасчета,
	ВТ_РазбитеПериода.ГрафикРаботы,
	ЕСТЬNULL(ВТ_РазбитеПериода.Период, ВТ_РазбитеПериода.ДатаНачала) КАК ДатаНачала,
	ВТ_РазбитеПериода.ДатаОкончания,
	ЕСТЬNULL(ВТ_РазбитеПериода.Оклад, СведенияОСотрудникахСрезПоследних.Оклад) КАК Размер
ИЗ
	ВТ_РазбитеПериода КАК ВТ_РазбитеПериода
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних(
				&КонецПериода,
				Сотрудник В
					(ВЫБРАТЬ РАЗЛИЧНЫЕ
						вт.Сотрудник
					ИЗ
						ВТ_РазбитеПериода КАК вт)) КАК СведенияОСотрудникахСрезПоследних
		ПО ВТ_РазбитеПериода.Сотрудник = СведенияОСотрудникахСрезПоследних.Сотрудник
...Показать Скрыть
77. Алексей Кубовцов (aleksey.kubovtsov) 26.08.15 12:54
сори . кривое решение. период конца не верно получается (
78. Михаил Цыбиков (tsmgeorg@gmail.com) 11.09.15 12:52
Спасибо большое! Очень помогает при подготовке.
79. Артем (korol-ar) 09.12.15 00:13
В п.20. Вроде как в 2-х местах надо график в набор добавлять?

Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни, ГрафикРаботы) Экспорт 

Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей();
Набор.Отбор.ГрафикРаботы.Установить(ГрафикРаботы); // 1. ДОБАВЛЯЕМ ОТБОР ПО ГРАФИКУ
//Набор.Прочитать(); // 2. КОММЕНТИРУЕМ ЧТЕНИЕ НАБОРА

ЧислоСекундВСутках = 86400;

Дат = ДатаНачала;
Для к = 0 По Набор.Количество()-1 Цикл

Запись = Набор[к];
Если Запись.Дата < ДатаНачала Тогда
    Продолжить;
ИначеЕсли Запись.Дата =Дат Тогда
Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда
Запись.Значение = 0;
Иначе          
Запись.Значение = 8;
КонецЕсли;
Дат = Дат + ЧислоСекундВСутках;
Иначе
Пока Дат < Мин(Запись.Дата, ДатаОкончания) Цикл
НоваяЗапись = Набор.Добавить();
//+++korol-ar:
НоваяЗапись .ГрафикРаботы = ГрафикРаботы; // 3. вот здесь еще ВСТАВЛЯЕМ НУЖНЫЙ ГРАФИК 
//---korol-ar.
НоваяЗапись.Дата = Дат;
Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда
НоваяЗапись.Значение = 0;
Иначе          
НоваяЗапись.Значение = 8;
КонецЕсли; 
Дат = Дат + ЧислоСекундВСутках;
КонецЦикла; 
Если Запись.Дата > ДатаОкончания Тогда
Прервать;
Иначе
Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда
Запись.Значение = 0;
Иначе          
Запись.Значение = 8;
КонецЕсли;
КонецЕсли;
Дат = Дат + ЧислоСекундВСутках;
КонецЕсли; 
КонецЦикла;
Набор.Записать();

Пока Дат <= ДатаОкончания Цикл
Запись = Набор.Добавить();
Запись.ГрафикРаботы = ГрафикРаботы; // 3. ВСТАВЛЯЕМ НУЖНЫЙ ГРАФИК
Запись.Дата = Дат;
Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда
Запись.Значение = 0;
Иначе          
Запись.Значение = 8;
КонецЕсли; 
Дат = Дат + ЧислоСекундВСутках;
КонецЦикла; 
Набор.Записать();

КонецПроцедуры
...Показать Скрыть
80. Sibiryak (Sibiryak) 06.01.16 17:45
Для каждого Строка Из СписокНоменклатуры Цикл
Запись = Движения.ТоварыНаСкладах.ДобавитьРасход();
Запись.Период = Дата;
Запись.Номенклатура = Строка.Номенклатура;
Запись.Склад = Склад;
Запись.Количество = Строка.Количество;
КонецЦикла;

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

Запрос.Текст = "ВЫБРАТЬ
| РасходнаяНакладнаяСписокНоменклатуры.Номенклатура,
| СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК КоличествоДокумент
|ПОМЕСТИТЬ втДанныеДокумента
|ИЗ
| Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры
|ГДЕ
|РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка
|СГРУППИРОВАТЬ ПО
| РасходнаяНакладнаяСписокНоменклатуры.Номенклатура
|;

Здесь можно проиндексировать поле "Номенклатура", т.к. в следующем запросе пакета идет поиск по этому полю этой временной таблицы.

Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Количество() Тогда
Отказ = Истина;
КонецЕсли;

Возможно, правильнее сделать так:
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда		
	Отказ = Истина; 
КонецЕсли;
...Показать Скрыть
81. Sibiryak (Sibiryak) 06.01.16 18:13
НоваяЗапись.Сумма = ?(Выборка.КоличествоДокумент = Выборка.КоличествоОстаток, Выборка.СуммаОстаток, 
 Окр(Выборка.КоличествоДокумент / Выборка.КоличествоОстаток,2) * Выборка.СуммаОстаток);

Почему округление с точностью до 2-х, а не до 3-х, например?
82. Артём Андриянов (CSiER) 19.03.16 19:22
(79) korol-ar, автор как раз говорит о том, что править график на экзамене скорее всего не придется - поэтому и комментирует строку "Набор.Прочитать()" (Ваш код не выполнится - "Набор.Количество()" = 0 ).
83. Timeforlive S (timeforlive) 21.04.16 14:00