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

Перед сдачей экзамена начитался в интернете мнений и отзывов, что времени на решение отведено очень мало (а это 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;
КонецЕсли;
Дат = Дат + ЧислоСекундВСутках;
КонецЦикла;
Набор.Записать();

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

90 Comments

  1. correct_coding

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

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

    Reply
  2. Новиков

    Молодец! Хорошая информация. Но, инфа кажется не полной без:

    1. Когда сам сдавал?

    2. С какого раза сдал?

    3. На курсы какие-нибудь ходил или тренинги?

    4. Сколько времени убито на подготовку?

    5. Ну и конечно, пруфлинки на ресурсы, которые помогли!

    Статьи такие уважаю!

    Reply
  3. tango

    автор мегамонстр +++

    Reply
  4. andru_dv

    Да, полезная информация для сдачи зачета.

    Спасибо!

    Reply
  5. tslk

    В пункте 6 по моему ошибочка :

    Выборка = Запрос.Выполнить().Выбрать();

    Если Выборка.Количество() Тогда

    ————————-#k8SjZc9Dxk

    Отказ = Истина;

    КонецЕсли;

    Reply
  6. svsource

    В общем ходил я на все курсы, тренинги по 8.2. За все сам платил. Хочу сказать что Вы молодец. Все что написано — по делу исключительно. Замечания АБСОЛЮТНО правильные. 5+ Вам. Сейчас как раз решаю задачи на время из СПЕЦА 8.2 по платформе. Планирую до майских обязательно сдать. То, что Вы написали — БУКВАЛЬНО то, что нам Гончаров Дмитрий, Козырев Дмитрий и т.д. на курсах несколько раз повторяли. Народ в 1С (преподаватели) все ПРАКТИКУЮЩИЕ СПЕЦЫ. Втереть им лажу не прокатит. Я хотел после курсов сразу пойти сдавать, Но Дмитрий Гончаров мой пыл охладил. Решать то я решаю задачи — но сейчас особенно!!!! требование решить АКАДЕМИЧЕСКИ ПРАВИЛЬНО, а не только чтоб работало 🙂 Полно примеров, когда все работает — но ставят 2. Народ обижается конечно — у меня друг на 4-ый круг пошел. Очень требуют чтоб задания были решены с учетом специфики именно платформы 8.2 и обязательно работали в тонком клиенте! Все что Вы написали — еще раз говорю — ПРАВИЛЬНО и АКТУАЛЬНО!!! Очень полезно для сдающих Спеца по платформе 8.2. С Уважением, Сергей.

    Reply
  7. musatov1c.ru

    Очень интересно. Просмотрел пока мельком. Оставляю как закладку для изучения. Требуется еще время для специалиста. 🙂

    Reply
  8. pparshin

    Замечательно! По делу и без воды.

    У меня три вопроса.

    1.в сети валяется управляемая консоль запросов

    Какая сеть имеется ввиду?

    2.откройте блокнот, и создайте себе несколько заготовок

    Подразумевается блокнот, который Notepad?

    3.За какое время до начала экзамена можно приходить?

    Reply
  9. sa1m0nn

    Спасибо, в мемориз. 2 раза уже лажанулся именно по причине нехватки времени, в январе на третий заход.

    Reply
  10. Alexey55

    Спасибо! очень полезная информация

    Reply
  11. DragonAgo

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

    Reply
  12. DragonAgo

    Хорошая статья!!!Автору риспект

    Reply
  13. ms200999

    Вот действительно достойная работа. Побольше бы подобных публикаций.

    Reply
  14. progr21

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

    Reply
  15. dell_anna

    Хорошая статья! Спасибо за проделанную работу! И все таки можете ответить на вопрос:

    1. За какое время до экзамена можно прийти?

    2. Сразу пускают в кабинет, чтобы например проделать все необходимые манипуляции (подготовки)?

    Reply
  16. no_registration

    Хорошая информация.

    Reply
  17. Программулькин

    Хорошая статья. Нужная,актуальная. Вот ещё бы ответы автора на заданные тут вопросы получить, было бы вообще чудненько.

    Reply
  18. F1_1

    Согласен с практически со всем комментраиями. Очень нужная статья. И как раз вовремя — решился на сдачу. Готовлюсь. Особенно нужным кажется высказывание про «АКАДЕМИЧЕСКИ ПРАВИЛЬНЫМ».

    Автору — большое спасибо.

    Reply
  19. dandrontiy

    Автору реальный респект! Если бы автор сего поста составил список правильных Академически решений по темам (не все билеты, а сам подход, видно что автор именно концептуально подходит к вопросу, что очень ценно) такую работу и за деньги было бы не грех приобрести! Труд проделанный им — очень полезен, готов так сказать оформить подписку на методические статьи…

    Reply
  20. dkprim

    невероятно полезная статья. краткость — сестра таланта. автору спасибо 🙂

    Reply
  21. DimanYa

    Где вы были месяц назад? =) А та прибавлю свои 5 копеек. Дома обязательно попытайтесь сделать один билет на время. Это кажется, что 4 часа, что даётся на экзамен это много. А когда начинаешь делать там, то времени жутко не хватает. И не забывайте сохраняться. У меня на сдаче вылетела 1с и я потерял 25 минут работы.

    Reply
  22. prestige

    Спасибо, написано умно, полезно и «академически правильно»;)

    Reply
  23. Fruit83

    Спасибо! понадобится в подготовке!

    Reply
  24. thang_madi

    Полезная информация!

    Reply
  25. Гость

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

    Reply
  26. Созинов

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

    Reply
  27. Bassgood

    (0) Хотел бы задать автору статьи некоторые вопросы и предложить внести некоторые изменения в ее содержание с целью более полного обзора:

    1. Поясните почему нужно применить именно управляемый, а не автоматический режим управления блокировками?

    6.1. Можно было бы дописать, что новая методика проведения заключается в том, что сначала записываются движения документа по соответствующему регистру, а затем уже производится проверка на наличие в регистре отрицательных остатков. И сказать что таких задач, в которых применяется новая методика проведения, небольшой процент — мне кажется ошибочно, она применяется в задачах, требующих контроль остатков, а таковыми являются практически все задачи по оперативному учету, в которых происходит списание товаров.

    6.2. Почему мы применили свойство набора записей БлокироватьДляИзменения, а не использовали управляемые транзакционные блокировки, как это было сделано в последующих примерах?

    6.3. В запросе в качестве параметра не указана ссылка на документ, из которого выбираются товары и помещаются в «втДанныеДокумента».

    6.4. Ошибка в выборке запроса: «Если Выборка.Количество() Тогда»

    7. А почему вместо этого нельзя просто использовать округление (функция Окр())?

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

    Reply
  28. ipyu

    Огромное спасибо за очень подробную и полезную информацию.

    Reply
  29. Uncore

    Очень полезная информация. Автору +1

    Reply
  30. VictorK

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

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

    На сколько я помню из вопросов на 1С: Профессионала по платформе 8.2, то

    «Управляемый» и «Автоматический» — эти режимы принудительно включают выбранный способ управления блокировками. Т.е. не важно какой способ поставился во всех новых созданных объектах. Если в свойствах самой конфигурации стоит «Управляемый» — то он будет привилегированным, автоматического не будет.

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

    Reply
  32. Sanek_GAL

    Спасибо! Очень полезная информация.

    Reply
  33. dimk@a

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

    Reply
  34. Artemuch2

    Доброе время суток! по своему опыту знаю что с первого раза сдать не получится точно — это раз. если ты не делал такое же задание то не успеешь ну или мегабыстрый программист- это два. на задании нужно решать только поставленную задачу и не отвлекаться ни на какие красивости- это три. ну и настроение преподавателя-это четыре

    Reply
  35. gavrikprog

    Кто знает, в терминале при сдаче дистанционно буфер обмена работает ?

    т.е. я пишу код локально, потом зашел в терминал и время пошло. А тот код кот. писал локально скопировал в терминал.

    Reply
  36. ris83

    «Если Выборка.Количество() Тогда»

    Никакой тут ошибки нет…вспомните неявное преобразование типов! Число преобразуется в булево по принципу 0-ложь, а все что больше в истину…Поэтому если результат запроса пустой то будет преобразовано в ЛОЖЬ. а если хоть одна или больше записей то будет ИСТИНА

    Reply
  37. cmd_vasec

    Спасибо. Отличная статья.

    Reply
  38. LivingStar

    а не верно ли получать учетную политику следующим образом?

    |

    // 1). Получение учетной политики ->

    Запрос = Новый Запрос;

    Запрос.Текст = »

    |ВЫБРАТЬ

    | УчетнаяПолитикаСрезПоследних.Период,

    | УчетнаяПолитикаСрезПоследних.МетодСписания

    |ИЗ

    | РегистрСведений.УчетнаяПолитика.СрезПоследних(, ГОД(период) = &Год) КАК УчетнаяПолитикаСрезПоследних»;

    Запрос.УстановитьПараметр(«Год»,Год(ТекущаяДата()));

    Рез = Запрос.Выполнить().Выбрать();

    Рез.Следующий();

    УчетнаяПолитика = Рез.МетодСписания;

    Если Не ЗначениеЗаполнено(УчетнаяПолитика) Тогда

    Сообщить(«Не заполнена учетная политика на » + Формат(ТекущаяДата(), «ДФ=»»гггг»»») + » год!»);

    Возврат;

    КонецЕсли;

    Reply
  39. Sunhare

    Спасибо. Полезно.

    Reply
  40. lolidy

    Спасибо большое! Очень полезная статья, скоро иду сдавать, очень пригодятся эти советы.

    Reply
  41. v.l.

    Статью прочитал «по диагонали», но радует описание, а не тупая копипаста в док-файл, который надо скачать.

    Reply
  42. MakcTLT63

    не ну круто конечно, наверное..

    но, после такого заполнения значений, дальше читать уже не хочется

    Для каждого Строка Из СписокНоменклатуры Цикл

    Запись = Движения.ТоварыНаСкладах.ДобавитьРасход();

    Запись.Период = Дата;

    Запись.Номенклатура = Строка.Номенклатура;

    Запись.Склад = Склад;

    Запись.Количество = Строка.Количество;

    КонецЦикла;

    И еще.. писать такую конструкцию ?(3=3,10, Окр(4/3,2)*10), да и вообще весь 7 пункт — это что-то за гранью добра и зла..

    Reply
  43. RailMen

    Спасибо! Жму руку!

    Reply
  44. Pechenuych_ka

    Очень хорошая статья!

    Reply
  45. Bukaska

    Хорошая статья, но поясните разницу между этим:

    Запись = Движения.ТоварыНаСкладах.ДобавитьРасход();

    И этим:

    Запись = Движения.ТоварыНаСкладах.Добавить()

    Запись.ВидДвижения = ВидДвиженияНакопления.Расход()

    Почему то в питере преподаватели рекомендуют все вариант ниже.

    Reply
  46. 1С-Учебный Центр №3

    (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

    Reply
  47. manan

    Вот здесь http://infostart.ru/public/66244/ решения более 100 задач из актуального»Сборника задач для подготовки к экзамену «1С:Специалист» по платформе «1С:Предприятие 8″. Версия 8.2 (артикул 4601546078247)» (редакция 3, 2011 год)

    Reply
  48. Graf_Cash

    Очень много полезной информации в одном месте.

    Коротко и по-делу. Спасибо

    Reply
  49. Limas

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

    Reply
  50. valex1c

    Хорошая статья

    Reply
  51. Yav4ik

    Интеренсая статья, спасибо!

    Reply
  52. andr_andrey

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

    Reply
  53. Isperator

    Статья хорошая, но сейчас сдают на Платформе 8.3. Кто нибудь может освежить информацию? Заранее спасибо.

    Reply
  54. kn

    (53)А что новые билеты на Спеца по 8.3 или просто на другой платформе?

    Reply
  55. Bukaska

    (54) kn, Ничего пока что не меняется.. главное чтобы работал интерфейс Такси.. то есть если на 8.2 важен был тонкий клиент, то для 8.3 надо чтобы работало в интерфейсе такси)

    Reply
  56. kn

    (55) Bukaska, спасибо

    Reply
  57. Isperator

    (54) kn, Звонил в 1С обещают сборник задач по 8.3 в конце мая. Изменятся ли задачи полностью или частично мне не ответили.

    Reply
  58. kn

    Спасибо, встречалась такая информация тоже, теперь значит точно.

    Reply
  59. 1С-Учебный Центр №3

    (57) Isperator, Принципиальных изменений нет, но формулировки немного изменились.

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

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

    Изменился технический принцип компоновки задач.

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

    Reply
  60. 1С-Учебный Центр №3

    Приглашаем на однодневный мастер-класс «Решение сквозной задачи с использованием платформы «1С:Предприятие 8» для подготовки к экзамену 1С:Специалист по платформе «1С:Предприятие 8», который состоится 29 мая 2014 г. 🙂

    Reply
  61. Isperator

    (60) 1С-Учебный Центр №3, Не подскажите, новый сборник задач вышел?

    Reply
  62. Bukaska

    (61) Isperator,

    Reply
  63. 1С-Учебный Центр №3

    (61) Isperator, на данный момент сборник по 8.3 еще не вышел, ждем информационного письма от 1С

    Reply
  64. Isperator

    (63) 1С-Учебный Центр №3, Спасибо за информацию.

    Reply
  65. mikhailovaew

    Не совсем понятно с проблемой копеек:

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

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

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

    Reply
  66. spetzpozh

    (65) mikhailovaew, округлять не обязательно, проблема копеек в том, что есть требование — при списании всего товара списывать оставшуюся себестоимость. Хотя не очень понятно, как проблема копеек может вылезти при расчете (КоличествоСписываю)/(КоличествоОсталось)*Стоимость. Ну да 1С хочет как в статье.

    Reply
  67. mikhailovaew

    (66) spetzpozh, конструкция ?(Выборка.КоличествоДокумент = Выборка.КоличествоОстаток, Выборка.СуммаОстаток, <…ДругаяСуммаРассчитннаяОтКоличества..>) мне понятна, чтобы при выбирании остатка количества выбрать всю оставшуюся сумму.

    Мне не понятно, зачем делать именно округление при расчете <…ДругойСуммыРассчитннойОтКоличества..>, оно дальше в расчетах не участвует (не влияет на получение других сумм), а при записи в регистр само округлится.

    Reply
  68. Astrey1C

    Отличная статья. Автору 5+.

    Reply
  69. Tedman
    Reply
  70. Isperator

    Ребята, поделитесь впечатлениями и опытом кто ходил сдавать в 2015 году на экзамен. Готовлюсь к экзамену.

    Reply
  71. reg-81

    Первоначальный запрос работает корректно, нужно только условие вместо «МЕЖДУ» поставить ДатаНачала > &ДатаНачала И ДатаОкончания <= &ДатаОкончания

    Reply
  72. temamart

    Проводки = Движения.Управленческий;

    Проводки.Записывать = Истина;

    Если НЕ Проводки.Модифицированность() И НЕ ЭтоНовый() Тогда

    Проводки.Прочитать();

    КонецЕсли;

    Зачем вот это условие? Проводки же всегда будут модифицированы.

    Reply
  73. avgyr77

    Спасибо автору за труд. идем здавать спеца!

    Reply
  74. wtlz

    А вот такой вопрос — как определить при записи набора записей регистра расчета когда надо замещать, а когда нет ? Ну и по ТолькоЗапись такой же вопрос)

    РегистрРасчетаНаборЗаписей.<Имя регистра расчета> (CalculationRegisterRecordSet.<Имя регистра расчета>)

    Записать (Write)

    Синтаксис:

    Записать(<Замещать>, <ТолькоЗапись>, <ЗаписьФактическогоПериодаДействия>, <ЗаписьПерерасчетов>)

    <Замещать> (необязательный)

    Тип: Булево.

    Определяет режим замещения существующей записи в соответствии с текущими установками отбора (т.е. по регистратору набора записей). Истина — перед записью существующие записи будут удалены. Ложь — записи будут дописаны к уже существующим в информационной базе записям.

    Reply
  75. DopeDigga

    (74) wtlz, ну судя по необязательности — то если критично и явно требуется или беречь размер ИБ, или, к примеру, иметь возможность запроситься к истории этих изменений, получается истина / ложь соответственно

    Reply
  76. aleksey.kubovtsov

    Коллеги , прокомментируйте плиз

    на экзамен кучу времени убил на запрос в РМ на разбитие периода

    вариант :

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

    Показать

    Reply
  77. aleksey.kubovtsov

    сори . кривое решение. период конца не верно получается (

    Reply
  78. tsmgeorg@gmail.com

    Спасибо большое! Очень помогает при подготовке.

    Reply
  79. korol-ar

    В п.20. Вроде как в 2-х местах надо график в набор добавлять?

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

    Показать

    Reply
  80. Sibiryak
    Для каждого Строка Из СписокНоменклатуры Цикл

    Запись = Движения.ТоварыНаСкладах.ДобавитьРасход();

    Запись.Период = Дата;

    Запись.Номенклатура = Строка.Номенклатура;

    Запись.Склад = Склад;

    Запись.Количество = Строка.Количество;

    КонецЦикла;

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

    Запрос.Текст = «ВЫБРАТЬ

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

    | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК КоличествоДокумент

    |ПОМЕСТИТЬ втДанныеДокумента

    |ИЗ

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

    |ГДЕ

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

    |СГРУППИРОВАТЬ ПО

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

    |;

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

    Выборка = Запрос.Выполнить().Выбрать();

    Если Выборка.Количество() Тогда

    Отказ = Истина;

    КонецЕсли;

    Возможно, правильнее сделать так:

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

    Почему округление с точностью до 2-х, а не до 3-х, например?

    Reply
  82. CSiER

    (79) korol-ar, автор как раз говорит о том, что править график на экзамене скорее всего не придется — поэтому и комментирует строку «Набор.Прочитать()» (Ваш код не выполнится — «Набор.Количество()» = 0 ).

    Reply
  83. timeforlive

    статьи, ошибка.

    Reply
  84. pyrkin_vanya

    Автор, вопрос про проблему копеек.

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

    У меня ситуация.

    КоличествоСписания = 1;

    КоличествоОстаток = 3;

    СуммаОстаток = 300;

    Прописал Вашу формулу и получается следующее:

    Окр(1 / 3, 2) * 300

    0,33 * 300 = 99.

    Видно же, что явная ошибка. Должно быть 100.

    Почему такая странная формула для расчету суммы списания?

    Reply
  85. talych

    (85)

    Списать = Мин(ОсталосьСписать, ВыборкаДетальные.КоличествоОстаток);

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

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

    Еще вопрос. А с тех пор методика блокировок уже изменилась?

    Reply
  86. user913680

    Из всего что видел ранее 9и прежде всего на этом сайте) — данная статья пока наиболее содержательная и полезная (все существенные моменты в одном месте). Но как всегда — четкий ответ вопрос когда использовать новую методику, а когда старую — замыливается.

    Reply
  87. Videon

    (87)

    Нашёл такой совет: ««Новый» метод контроля остатков использовать там, где не нужно рассчитывать себестоимость при проведении (она плановая или расчет в конце периода)».

    Reply
  88. Videon

    С округлением в 7-м пункте такая хрень, что сил нет.

    При примере 1/3 * 10 получится, что первые товары спишутся по 33, а последний по 34.

    Хотя вполне можно сделать не такую большую разницу (2* 33,33 и 1* 33,34).

    Окр(Выборка.КоличествоДокумент / Выборка.КоличествоОстаток * Выборка.СуммаОстаток), 2)

    Скорее так получше будет, но смысл теряется, ибо тип СуммаОстаток (число) подразумевает 2 знака, после запятой…

    Reply
  89. Videon

    (89) И ещё к этому пункту замечание.

    там, наверное, не Выборка.КоличествоДокумент = Выборка.КоличествоОстаток должно быть, а

    Выборка.КоличествоДокумент >= Выборка.КоличествоОстаток …

    Reply
  90. v.l.

    (61) не подскажЕте.

    не подскажете, вышел новый сборник?

    Не подсказывайте ему! Не подскажите ему! Он сам должен знать!

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *