Неправильно рассчитывает номер недели в году, функция корректного расчета Для определения номера недели в конфигурациях 1С обычно используется стандартная функция НеделяГода().
Например 17 октября 2016 года:
НеделяГода() возвращает 43 , а по обычному календарю это 42:
Судя по всему, 1С считает по американской системе. "По европейской норме (DIN 1355 / ISO 8601) первой неделей года считается неделя, содержащая 4 января данного года (http://vsegost.com/Catalog/62/6263.shtml) . А в США первой неделей считается любая неделя, содержащая первое января, независимо от числа дней".
Чтобы 1С возвращала номер недели, совпадающий с "человеческими" календарями и ежедневниками, предлагается использовать следующую функцию:
Код 1C v 8.х Функция НеделяГодаПоISO8601(Знач Дата, Год=Неопределено) Экспорт
Если ДеньНедели(НачалоГода(Дата)) <= 4 тогда //если первая неделя года начинается до четверга, т.е. в ней есть четверг
//значит год начинается с первой недели
Год = Год(Дата);
Неделя = НеделяГода(Дата);
Возврат Неделя;
Иначе
//год начинается с последней недели прошлого года
Неделя = НеделяГода(Дата)-1;
Если Неделя = 0 тогда //если это до первой недели года
Неделя = НеделяГодаПоISO8601(НачалоГода(Дата)-1, Год); //значит это последняя неделя прошлого года
Иначе
Год = Год(Дата);
КонецЕсли;
КонецЕсли;
Возврат Неделя;
КонецФункции
// Более короткий вариант:
Функция НеделяГода_ISO8601(Дата)
Корректировочная = НеделяГода(Дата(Год(Дата),1,4)) - 1;
Результат = НеделяГода(Дата) - Корректировочная;
Результат = ?(Результат = 0, НеделяГода_ISO8601(ДобавитьМесяц(КонецГода(Дата), -12)), Результат);
Возврат Результат;
КонецФункции
Категория:
Работа с Датами (Временем) Как изменить запись регистра сведений? Код 1C v 8.х НаборЗаписей = РегистрыСведений.НумерацияДоговоров.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Период.Установить(НачалоГода(Дата));
НаборЗаписей.Отбор.Организация.Установить(Организация);
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() = 0 Тогда
НовыйНомер = НаборЗаписей.Добавить();
НовыйНомер.Организация = Организация;
НовыйНомер.Период = НачалоГода(Дата);
НовыйНомер.Номер = 2; ном=1;
ИначеЕсли НаборЗаписей.Количество() = 1 Тогда
НовыйНомер = НаборЗаписей[0];
ном = НовыйНомер.Номер;
НовыйНомер.Номер = ном+1;
КонецЕсли;
НаборЗаписей.Записать();
Номер = Организация.Префикс + "-" + Ном + "/" + Строка(Прав(Год(ТекущаяДата()),2));
Код 1C v 8.х //Установить курс Валюты USD
КурсыВалют = РегистрыСведений.КурсыВалют;
НаборКурсов = КурсыВалют.СоздатьНаборЗаписей();
Доллар = Справочники.Валюты.НайтиПоНаименованию("USD");
НаборКурсов.Отбор.Валюта.Установить(Доллар);
НаборКурсов.Отбор.Период.Установить(НачалоДня(ТекущаяДата()));
НаборКурсов.Прочитать();
Если НаборКурсов.Количество() = 0 Тогда
НовыйКурс = НаборКурсов.Добавить();
НовыйКурс.Валюта = Доллар;
НовыйКурс.Период = ТекущаяДата();
ИначеЕсли НаборКурсов.Количество() = 1 Тогда
НовыйКурс = НаборКурсов[0];
Иначе
Предупреждение("Курс валюты задается один раз в день.", 60);
Возврат;
КонецЕсли;
НовыйКурс.Курс = 31.44;
НовыйКурс.Кратность = 1;
НаборКурсов.Записать();
Код 1C v 8.х //В регистр были ошибочно записаны штрихкоды.
// Нужно по заданным Номенклатуре (Товар) и Характеристике (ХарактеристикаТовара) найти эту запись и заменить там штрихкод.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
|ГДЕ
| ШтрихкодыНоменклатуры.Номенклатура = &Номенклатура И
| ШтрихкодыНоменклатуры.Характеристика = &Характеристика";
Запрос.УстановитьПараметр("Номенклатура", Товар);
Запрос.УстановитьПараметр("Характеристика", ХарактеристикаТовара);
Выборка = Запрос.Выполнить().Выбрать();
Если НЕ Выборка.Следующий() Тогда
ТекЗапись = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
ТекЗапись.Номенклатура = Товар;
Если ЗначениеЗаполнено(ХарактеристикаТовара) Тогда
ТекЗапись.Характеристика = ХарактеристикаТовара;
Иначе
ТекЗапись.Характеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка();
КонецЕсли;
ТекЗапись.Штрихкод = ?(ПустаяСтрока(ШтрихКод),РегистрыСведений.ШтрихкодыНоменклатуры.СформироватьШтрихкодEAN13(), Штрихкод);
Попытка
ТекЗапись.Записать();
Исключение
КонецПопытки;
Иначе
НайденныйШтрихкод = Выборка.Штрихкод;
ТекЗапись = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
ТекЗапись.Штрихкод = НайденныйШтрихкод;
ТекЗапись.Прочитать();
ТекЗапись.Штрихкод = Штрихкод;
Попытка
ТекЗапись.Записать();
Исключение
КонецПопытки;
КонецЕсли;
Категория:
Регистры сведений Как установить период в списке документов? Как изменить период в журнале документов программно?
Код 1C v 8.х
// Код устанавливает период в списке документов взависимости от выбранной периодичности:
Если Периодичность = Перечисления.Периодичность.Год Тогда
ДатаНачала = НачалоГода(РабочаяДата);
ИначеЕсли Периодичность = Перечисления.Периодичность.Квартал Тогда
ДатаНачала = НачалоКвартала(РабочаяДата);
ИначеЕсли Периодичность = Перечисления.Периодичность.Месяц Тогда
ДатаНачала = НачалоМесяца(РабочаяДата);
ИначеЕсли Периодичность = Перечисления.Периодичность.Неделя Тогда
ДатаНачала = НачалоНедели(РабочаяДата);
ИначеЕсли Периодичность = Перечисления.Периодичность.День Тогда
ДатаНачала = НачалоДня(РабочаяДата);
Иначе
ДатаНачала = НачалоДня(РабочаяДата);
КонецЕсли;
ДокументСписок.Отбор.Дата.ВидСравнения=ВидСравнения.ИнтервалВключаяГраницы;
ДокументСписок.Отбор.Дата.ЗначениеС = ДатаНачала;
ДокументСписок.Отбор.Дата.ЗначениеПо = КонецДня(РабочаяДата);
ДокументСписок.Отбор.Дата.Использование = Истина;
Категория:
Документы Загрузка данных из таблицы значений в регистр сведений В документе есть табличная часть вида
№ Инвентарная группа Январь Февраль Март Апрель ... и т.д.
1 Бумага 150 175 130 140 ...
1 Кантовары 50 15 30 27 ...
1 Хозтовары 10 29 37 60 ...
Нужно выгрузить табличную часть документа в Таблицу значений и загрузить в регистр сведений
Период Дата Подразделение Инвентарная группа Количество
01.01.2010 01.01.2010 Хоз. Отдел Бумага 150
01.01.2010 02.01.2010 Хоз. Отдел Бумага 175
01.01.2010 03.01.2010 Хоз. Отдел Бумага 130
...........................
01.01.2010 01.01.2010 Хоз. Отдел Кантовары 50
01.01.2010 02.01.2010 Хоз. Отдел Кантовары 15
01.01.2010 03.01.2010 Хоз. Отдел Кантовары 30
.....
и т.д
вот примерный код:
Код 1C v 8.х ТЗ = Новый ТаблицаЗначений;
ТЗ = СписокИнвентарныхГрупп.Выгрузить();
СчетчикКолонок = 2;
СчетчикСтрок = 0;
Пока СчетчикСтрок < СписокИнвентарныхГрупп.Количество()Цикл
Пока СчетчикКолонок<=13 Цикл
НаборДанных = РегистрыСведений.ЛимитыИнвентаря.СоздатьНаборЗаписей();
НаборДанных.Отбор.ИнвентарнаяГруппа.Установить(ТЗ[СчетчикСтрок][1]);
НаборДанных.Отбор.Подразделение.Установить(ПОдразделение);
НаборДанных.Отбор.Дата.Установить(ДобавитьМесяц(НачалоГода(Период),СчетчикКолонок-2));
НаборДанных.Прочитать();
Если НаборДанных.Количество() = 0 Тогда
Запись = НаборДанных.Добавить();
Иначе
Запись = НаборДанных[0];
КонецЕсли;
Запись.Подразделение = Подразделение;
Запись.ИнвентарнаяГруппа = ТЗ[СчетчикСтрок][1];
Запись.Дата = ДобавитьМесяц(НачалоГода(Период),СчетчикКолонок-2);
Запись.Количество = ТЗ[СчетчикСтрок][СчетчикКолонок+1];
Запись.Период = Период;
НаборДанных.Записать();
СчетчикКолонок = СчетчикКолонок+1;
КонецЦикла;
СчетчикСтрок = СчетчикСтрок+1;
СчетчикКолонок = 2;
КонецЦикла;
Категория:
Регистры сведений Функция вычисляет даты начала/конца периодов за интервал в виде таблицы значений Код 1C v 8.х //Начало, Конец - начало и конец периода
//Периодичность - строка "День", "Месяц", "Неделя", "Год", "Квартал"
//Возвращает таблицу значений с колонками:
// Начало - начало интервала
// Конец - конец интервала
// Номер - номер интервала (начиная с единицы)
Функция обПериодыЗаИнтервал(Начало, Конец, Периодичность="День", ВыравниваниеПоПериоду=истина)
Перем Р, Номер, ТекПериод, СледПериод;
Р=Новый ТаблицаЗначений();
Р.Колонки.Добавить("Начало");
Р.Колонки.Добавить("Конец");
Р.Колонки.Добавить("Номер");
ТекПериод=Начало;
Номер=1;
Пока истина Цикл
Если Периодичность="День" Тогда
Если ВыравниваниеПоПериоду Тогда
ТекПериод=НачалоДня(ТекПериод);
СледПериод=КонецДня(ТекПериод);
Иначе
СледПериод=обДобавитьДни(ТекПериод, 1);
КонецЕсли;
ИначеЕсли Периодичность="Месяц" Тогда
Если ВыравниваниеПоПериоду Тогда
ТекПериод=НачалоМесяца(ТекПериод);
СледПериод=КонецМесяца(ТекПериод);
Иначе
СледПериод=обДобавитьМесяцы(ТекПериод, 1);
КонецЕсли;
ИначеЕсли Периодичность="Год" Тогда
Если ВыравниваниеПоПериоду Тогда
ТекПериод=НачалоГода(ТекПериод);
СледПериод=КонецГода(ТекПериод);
Иначе
СледПериод=обДобавитьМесяцы(ТекПериод, 12);
КонецЕсли;
ИначеЕсли Периодичность="Квартал" Тогда
Если ВыравниваниеПоПериоду Тогда
ТекПериод=НачалоКвартала(ТекПериод);
СледПериод=КонецКвартала(ТекПериод);
Иначе
СледПериод=обДобавитьМесяцы(ТекПериод, 3);
КонецЕсли;
ИначеЕсли Периодичность="Неделя" Тогда
Если ВыравниваниеПоПериоду Тогда
ТекПериод=НачалоНедели(ТекПериод);
СледПериод=КонецНедели(ТекПериод);
Иначе
СледПериод=обДобавитьДни(ТекПериод, 7);
КонецЕсли;
Иначе
ВызватьИсключение "Неизвестная периодичность времени:"+Периодичность;
КонецЕсли;
Если ТекПериод>Конец И НЕ Номер=1 Тогда
Прервать;
КонецЕсли;
Стр=Р.Добавить();
Стр.Начало=ТекПериод;
Стр.Конец=СледПериод;
Стр.Номер=Номер;
ТекПериод=СледПериод+1; //Переходим на следующий период (добавляем одну секунду)
Номер=Номер+1;
КонецЦикла;
Возврат Р;
КонецФункции
Категория:
Работа с Датами (Временем) Выбрать движения, получить выборку записей регистра накопления Пример 1 :
Код 1C v 8.х
//Взаиморасчеты за период, хотя, это лучше выбирать запросом , он в примере 3
Отбор = Новый Структура("Организация", Организация);
НаборЗаписей = РегистрыНакопления.ВзаиморасчетыСРаботникамиОрганизаций.Выбрать(ПериодРегистрации, КонецМесяца(ПериодРегистрации), Отбор);
Пока Выборка.Следующий() Цикл
// код обработки например:
Сум=Сум+Выборка.СуммаВзаиморасчетов;
КонецЦикла;
Пример 2 :
Код 1C v 8.х
// Посчитаем, сколько отгружено с начала года
УчетНоменклатуры = РегистрыНакопления.УчетНоменклатуры;
ОтборПоТовару = Новый Структура("Номенклатура");
ОтборПоТовару.Номенклатура = ВыбТовар;
НачДата = НачалоГода(ТекущаяДата());
КонДата = ТекущаяДата();
Выборка = УчетНоменклатуры.Выбрать(НачДата,КонДата,ОтборПоТовару);
Расход =0;
Пока Выборка.Следующий() Цикл
Если Выборка.ВидДвижения = ВидДвиженияНакопления.Расход Тогда
Расход = Расход + Выборка.Количество;
КонецЕсли;
КонецЦикла;
Предупреждение("Отгружено с начала года """ + СокрЛП(ВыбТовар) + """ = "+ Расход + " шт.");
Пример 3 :
Код 1C v 8.х
Запрос=новый Запрос;
Запрос.Текст="
|ВЫБРАТЬ
| ВзаиморасчетыСРаботникамиОрганизаций.СуммаВзаиморасчетов,
| ВзаиморасчетыСРаботникамиОрганизаций.СуммаВUSD,
| ВзаиморасчетыСРаботникамиОрганизаций.Физлицо
|ИЗ
| РегистрНакопления.ВзаиморасчетыСРаботникамиОрганизаций КАК ВзаиморасчетыСРаботникамиОрганизаций
|ГДЕ
| ВзаиморасчетыСРаботникамиОрганизаций.Физлицо = &Физлицо
| И ВзаиморасчетыСРаботникамиОрганизаций.ПериодВзаиморасчетов = &ПериодВзаиморасчетов
| И ВзаиморасчетыСРаботникамиОрганизаций.Организация = &Организация
| И ВзаиморасчетыСРаботникамиОрганизаций.ХарактерВыплаты = &ХарактерВыплаты
|";
Запрос.УстановитьПараметр("Организация",Организация);
Запрос.УстановитьПараметр("ПериодВзаиморасчетов",ПериодРегистрации);
Запрос.УстановитьПараметр("Физлицо",ТекущаяСтрока.Физлицо);
Запрос.УстановитьПараметр("ХарактерВыплаты",Перечисления.ХарактерВыплатыЗарплаты.ПлановыйАванс);
Результат = Запрос.Выполнить();
Результат = Результат.Выбрать();
Пока Результат.Следующий() Цикл
// код обработки например:
СумАванс=СумАванс+Результат.СуммаВзаиморасчетов;
КонецЦикла;
Категория:
Регистры накопления Выборка, перебор документов Код 1C v 8.х // Выборка документов за весь период
Выборка = Документы.НачислениеОтпуска.Выбрать();
Пока Выборка.Следующий() Цикл
//Модуль обработки
КонецЦикла;
// Выборка документов за период с Даты начала по Дата окончания
//Выборка = Документы.РасходнаяНакладная.Выбрать(ДатаНач, ДатаКон);
ВыборкаДокументов = Документы.РасходнаяНакладная.Выбрать(НачалоГода(ТекущаяДата()), КонецГода(ТекущаяДата()));
Пока ВыборкаДокументов.Следующий() Цикл
// Действия с документом - элементом выборки,
// его значение содержится в переменной ВыборкаДокументов
КонецЦикла
//Запросом:
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| РеализацияТоваровУслуг.Ссылка
|ИЗ
| Документ. РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Контрагент = &Контрагент
| И
| (РеализацияТоваровУслуг.Номер < 100 | ИЛИ | РеализацияТоваровУслуг.Дата < ДАТАВРЕМЯ(2005, 1, 1))
| И
| РеализацияТоваровУслуг.Товары.Номенклатура В ИЕРАРХИИ(&Номенклатура)";
Запрос.УстановитьПараметр("Контрагент", ОтбКонтрагент);
Запрос.УстановитьПараметр("Номенклатура", ОтбНоменклатура);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
// действия с документом - элементом выборки,
// его значение содержится в переменной Выборка
КонецЦикла;
Категория:
Документы