Разница между датами в рабочих днях, подсчет рабочих дней в 1С Разрабатывая некий функционал в 1С, бывает, необходимо посчитать количество рабочих дней после какой-то даты.
В этой статье примеры кода и запросы в которых считается количество рабочих дней:
Код, при вычислении определяет только по дню недели, викидывая выходные. Праздники не учитывает!
Код 1C v 8.х Функция РабочихДнейСДаты(НачДата,КолвоДней) Экспорт
Перем РабочихДней, ОбычныхДней, ДеньНедели;
РабочихДней = 0; ОбычныхДней = 0;
Пока РабочихДней < Число(КолвоДней) Цикл
ОбычныхДней = ОбычныхДней+ 1;
// определим день недели
ДеньНедели=ДеньНедели(НачДата+(ОбычныхДней*86400));
// если не выходной, то прошел еще один рабочий день
Если ДеньНедели < 6 Тогда
РабочихДней=РабочихДней+1;
КонецЕсли;
КонецЦикла;
Возврат (НачДата + (РабочихДней*86400));
КонецФункции
// Пример использования
ТриДняОтОбработки = РабочихДнейСДаты(нДатаОбработки,3);
Если РабочаяДата>ТриДняОтОбработки Тогда
Предупреждение("Прошло больше 3-х дней после обработки заказа. Цены не актуальны!
|Отправьте заказ на новую обработку! ");
Иначе
// ... неки код
КонецЕсли;
В запросе, с использованием производственного календаря и учетом всех праздников:
Код 1C v 8.х ВЫБРАТЬ
РегламентированныйПроизводственныйКалендарь.ДатаКалендаря КАК Дата
ПОМЕСТИТЬ Даты
ИЗ
РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
РегламентированныйПроизводственныйКалендарь.ДатаКалендаря В(&ВходящиеДаты)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Даты.Дата,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) КАК КоличествоРабочихДней,
МАКСИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) КАК ДатаКалендаря,
РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря КАК ДатаКалендаряДляГруппировки
ИЗ
РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Даты КАК Даты
ПО (Даты.Дата <= РегламентированныйПроизводственныйКалендарь.ДатаКалендаря)
И (ДОБАВИТЬКДАТЕ(Даты.Дата, ДЕНЬ,ГлубинаДней) > РегламентированныйПроизводственныйКалендарь.ДатаКалендаря)
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь1
ПО РегламентированныйПроизводственныйКалендарь.ДатаКалендаря <= РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря
ГДЕ
(РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный)
ИЛИ РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий))
СГРУППИРОВАТЬ ПО
РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря,
Даты.Дата
ИМЕЮЩИЕ
МАКСИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря
И КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) =РабочихДней
Еще один вариант, в котором допустим, что:
1) Регистр сведений Календарь имеет структуру (Измерения={ДатаКалендаря}, Ресурсы={ВидДня}), а перечисление ВидыДня задано как {Рабочий, Предпразничный} и праздничные дни в календаре отсутствуют.
2) В документе Реализация заданы поля Дата и ОтсрочкаДней. Тогда:
Код 1C v 8.х Выбрать
Р.Ссылка, Р.Дата,
минимум(isnull(К.ДатаКалендаря, добавитькдате(Р.Дата, день, Р.ОтсрочкаДней))) как ДатаКредита
из Документ.Реализация как Р
левое соединение РегистрСведений.Календарь как К
по добавитькдате(Р.Дата, день, Р.ОтсрочкаДней) <= К.ДатаКалендаря
сгруппировать по
Р.Ссылка, Р.Дата
Собственно, если календарь содержит и праздничные дни, то можно добавить секцию ГДЕ, и там отобрать только рабочие дни. В секции ГДЕ можно отобрать и интересующий календарь, если ведется несколько календарей.
Категория:
Работа с Датами (Временем) Как программно создать документ копированием? При доработке какого-либо процесса, бывает необходимо программно создать документ копированием по ссылке уже созданного в базе.
Код позволяющий создать документ копированием:
Код 1C v 8.х Процедура ДействияФормыДобавитьКопированием(Кнопка)
колдок = 5;
Если ВвестиЧисло(колдок,"Сколько создать?") Тогда
Для н=1 по колдок Цикл
// Копирование документа
ДокументКопия = ЭтаФорма.ЭлементыФормы.Список.ТекущаяСтрока.Скопировать();
ДокументКопия.Дата = РабочаяДата;
ДокументКопия.Записать();
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Категория:
Документы Оформление строки в ПриПолученииДанных или ПриВыводеСтроки Событие ПриПолученииДанных использется для оформления ячеек строк данных, отображаемых табличным полем. Обработчик данного события вызывается табличным полем в тех же случаях, что и обработчик ПриВыводеСтроки , т.е. при обновлении данных, отображаемых табличным полем или при поиске по подстроке. Важно отметить, что обработчик данного события вызывается табличным полем перед вызовом обработчиков события ПриВыводеСтроки для всех видимых строк табличного поля. Основным отличием данного события от события ПриВыводеСтроки является то, что в обработчике события ПриПолученииДанных можно изменять настройки ячеек группы строк, а не одной строки как в обработчике события ПриВыводеСтроки .
Обрабатывая данное событие можно изменять шрифт, цвет фона или текста, как определенной ячейки, так и всей строки табличного поля, устанавливать высоту или видимость ячеек строки табличного поля, а также устанавливать картинку, флажок или новый текст в ячейке. Параметром данного события является объект типа ОформлениеСтрок - коллекция объектов типа ОформлениеСтроки , являющихся оформлениями строк табличного поля.
Пример кода:
Код 1C v 8.х Процедура ТППриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
Попытка
ОформлениеСтроки.Ячейки.ПредоплатаОтсрочка.УстановитьТекст(?(ОформлениеСтроки.ДанныеСтроки.Ссылка.Счет.ДоговорКонтрагента.КонтролироватьЧислоДнейЗадолженности, "ОТСРОЧКА","ПРЕДОПЛАТА"));
Исключение
КонецПопытки;
Если ОформлениеСтроки.Ячейки.Доставка.Значение = Неопределено Тогда
возврат;
КонецЕсли;
Если ДанныеСтроки.Доставка.Проведен Тогда
ОформлениеСтроки.Ячейки.Картинка.ИндексКартинки = 0;
ИначеЕсли ДанныеСтроки.Доставка.ПометкаУдаления Тогда
ОформлениеСтроки.Ячейки.Картинка.ИндексКартинки = 1;
Иначе
ОформлениеСтроки.Ячейки.Картинка.ИндексКартинки = 2;
КонецЕсли;
ОформлениеСтроки.Ячейки.Картинка.ОтображатьКартинку = истина;
Если ДанныеСтроки.СтатусНов = "Нет машины" Тогда
ОформлениеСтроки.Ячейки.СтатусНов.ЦветФона = Новый Цвет(255, 196, 196);
ИначеЕсли ДанныеСтроки.СтатусНов = "Нет разрешения" Тогда
текцвет = Новый Цвет(255, 196, 196);
Если ДанныеСтроки.Доставка.ДатаДоставки = НачалоДня(РабочаяДата) Тогда
ТекВремя = Дата(1,1,1)+(ТекущаяДата()-НачалоДня(ТекущаяДата()));
Попытка ПодачаМашины=?(ДанныеСтроки.Доставка.ВремяЗагрузкиФакт[0].ПодачаМашины>ДанныеСтроки.Доставка.ВремяПриездаЭкспедитораФакт,ДанныеСтроки.Доставка.ВремяЗагрузкиФакт[0].ПодачаМашины,ДанныеСтроки.Доставка.ВремяПриездаЭкспедитораФакт); Исключение ПодачаМашины = ДанныеСтроки.Доставка.ВремяПриездаЭкспедитораФакт; КонецПопытки;
Если ПодачаМашины+(15*60)> ТекВремя Тогда ОформлениеСтроки.Ячейки.СтатусНов.УстановитьТекст("Получение разрешения"); текцвет = Новый Цвет(255, 225, 225); КонецЕсли;
КонецЕсли;
ОформлениеСтроки.Ячейки.СтатусНов.ЦветФона = текцвет;
ИначеЕсли ДанныеСтроки.СтатусНов = "Загрузка" Тогда
ОформлениеСтроки.Ячейки.СтатусНов.ЦветФона = Новый Цвет(255, 153, 0);
ИначеЕсли ДанныеСтроки.СтатусНов = "В пути" Тогда
ОформлениеСтроки.Ячейки.СтатусНов.ЦветФона = Новый Цвет(255, 255, 0);
ИначеЕсли ДанныеСтроки.СтатусНов = "На объекте" Тогда
ОформлениеСтроки.Ячейки.СтатусНов.ЦветФона = Новый Цвет(51, 204, 204);
ИначеЕсли ДанныеСтроки.СтатусНов = "Завершено" Тогда
ОформлениеСтроки.Ячейки.СтатусНов.ЦветФона = Новый Цвет(137, 255, 113);
КонецЕсли;
Если ЗначениеЗаполнено(ДанныеСтроки.СтатусSMS) Тогда
Если ДанныеСтроки.СтатусSMS = "Доставлено" Тогда
ОформлениеСтроки.Ячейки.СтатусSMS.ЦветФона = Новый Цвет(137, 255, 113);
ИначеЕсли ДанныеСтроки.СтатусSMS = "Поставлено в очередь" ИЛИ
ДанныеСтроки.СтатусSMS = "Отправляется" ИЛИ
ДанныеСтроки.СтатусSMS = "Отправлено" Тогда
ОформлениеСтроки.Ячейки.СтатусSMS.ЦветФона = Новый Цвет(255, 255, 0);
Иначе
ОформлениеСтроки.Ячейки.СтатусSMS.ЦветФона = Новый Цвет(255, 0, 0);
КонецЕсли;
КонецЕсли;
ОформлениеСтроки.Ячейки.колКОтгрузке.УстановитьТекст(ДанныеСтроки.колКОтгрузке);
Если ДанныеСтроки.колКОтгрузке = "ОК" Тогда
ОформлениеСтроки.Ячейки.колКОтгрузке.ЦветФона = Новый Цвет(200, 255, 200);
Иначе
ОформлениеСтроки.Ячейки.колКОтгрузке.ЦветФона = Новый Цвет(255, 0, 0);
КонецЕсли;
ОформлениеСтроки.Ячейки.колСДоставки.УстановитьТекст(ДанныеСтроки.колСДоставки);
Если ДанныеСтроки.колСДоставки = "ОК" Тогда
ОформлениеСтроки.Ячейки.колСДоставки.ЦветФона = Новый Цвет(200, 255, 200);
Иначе
ОформлениеСтроки.Ячейки.колСДоставки.ЦветФона = Новый Цвет(255, 0,0);
КонецЕсли;
//Доставка до 14.00 раскраска цветом
Если НЕ (ДанныеСтроки.Доставка.ВидДоставки = Перечисления.ВидыДоставки.Самовывоз или ДанныеСтроки.Доставка.ВидДоставки = Перечисления.ВидыДоставки.Централизация) Тогда
Если ДанныеСтроки.Доставка.Дата < НачалоДня(ДанныеСтроки.Доставка.Дата)+60*60*14 Тогда ОформлениеСтроки.Ячейки.Менеджер.ЦветФона = Новый Цвет(166, 255, 166); Иначе ОформлениеСтроки.Ячейки.Менеджер.ЦветФона = Новый Цвет(255, 166,166); КонецЕсли;
КонецЕсли;
КонецПроцедуры
А вот так это выглядит в реальности:
Категория:
Список Справочника, Документов, Регистров Настройка периода, интервала динамического списка Вот несколько вариантов
Программной установки периода, интервала динамического списка на управляемой форме
Код 1C v 8.2 УП Элементы.ДинамическийСписок.Период = Новый СтандартныйПериод(ВариантСтандартногоПериода.Сегодня);
//или
Элементы.Список.Период = Новый СтандартныйПериод(ВариантСтандартногоПериода.ЭтотКвартал);
Код 1C v 8.2 УП
Элементы.Список.Период.Вариант = СтруктураПараметров.Период.Вариант;
Элементы.Список.Период.ДатаНачала = СтруктураПараметров.Период.ДатаНачала;
Элементы.Список.Период.ДатаОкончания = СтруктураПараметров.Период.ДатаОкончания;
//Или
СП = Элементы.Список.Период;
СП.ДатаНачала = НачалоМесяцы(РабочаяДата);
СП.ДатаОкончания = КонецМесяца(РабочаяДата);
Категория:
Документы Как установить период в списке документов? Как изменить период в журнале документов программно?
Код 1C v 8.х
// Код устанавливает период в списке документов взависимости от выбранной периодичности:
Если Периодичность = Перечисления.Периодичность.Год Тогда
ДатаНачала = НачалоГода(РабочаяДата);
ИначеЕсли Периодичность = Перечисления.Периодичность.Квартал Тогда
ДатаНачала = НачалоКвартала(РабочаяДата);
ИначеЕсли Периодичность = Перечисления.Периодичность.Месяц Тогда
ДатаНачала = НачалоМесяца(РабочаяДата);
ИначеЕсли Периодичность = Перечисления.Периодичность.Неделя Тогда
ДатаНачала = НачалоНедели(РабочаяДата);
ИначеЕсли Периодичность = Перечисления.Периодичность.День Тогда
ДатаНачала = НачалоДня(РабочаяДата);
Иначе
ДатаНачала = НачалоДня(РабочаяДата);
КонецЕсли;
ДокументСписок.Отбор.Дата.ВидСравнения=ВидСравнения.ИнтервалВключаяГраницы;
ДокументСписок.Отбор.Дата.ЗначениеС = ДатаНачала;
ДокументСписок.Отбор.Дата.ЗначениеПо = КонецДня(РабочаяДата);
ДокументСписок.Отбор.Дата.Использование = Истина;
Категория:
Документы Прямой SQL запрос к базе 7.7 из базы 8.x Код 1C v 8.х РабДата=Лев(СокрЛП(РабочаяДата),10);
//НачПрошлогоМесяца=Лев(СокрЛП(НачалоМесяца(ДобавитьМесяц(РабочаяДата, -1 ))),10);
НачПрошлогоМесяца=Лев(СокрЛП(НачалоМесяца(РабочаяДата)),10);
НачМесяца=Лев(СокрЛП(НачалоМесяца(РабочаяДата)),10);
МойЗапрос = "
|S_elect SC172.DESCR, RG38027.SP38025, _1SJOURN.DOCNO, LEFT(_1SJOURN.DATE_TIME_IDDOC, 8) AS DATADOC, SUM(RG38027.SP38026) AS Ost
|FROM RG38027, SC172, _1SJOURN, DH38011
|WHERE (RG38027.SP38024 = SC172.ID) AND (CONVERT (DATETIME , RG38027.PERIOD) = CONVERT (DATETIME , '"+НачПрошлогоМесяца+"')) AND
|(RG38027.SP38025 = _1SJOURN.IDDOC) AND (RG38027.SP38025 = DH38011.IDDOC)
|AND (DH38011.SP38005 = ' 3Z ')
|GROUP BY SC172.DESCR, RG38027.SP38025, _1SJOURN.DOCNO, _1SJOURN.DATE_TIME_IDDOC
|
|U_nion ALL
|
|S_elect SC172.DESCR, RA38027.SP38025, _1SJOURN.DOCNO, LEFT(_1SJOURN.DATE_TIME_IDDOC, 8) AS DATADOC, SUM(RA38027.SP38026*(1-2*RA38027.DEBKRED)) AS Ost
|FROM RA38027, SC172, _1SJOURN, DH38011
|WHERE (RA38027.SP38024 = SC172.ID) AND (RA38027.IDDOC=_1SJOURN.IDDOC) AND
|(CONVERT (DATETIME , LEFT(_1SJOURN.DATE_TIME_IDDOC,8)) <= CONVERT (DATETIME , '"+РабДата+"')) AND
|(CONVERT (DATETIME , LEFT(_1SJOURN.DATE_TIME_IDDOC,8)) > CONVERT (DATETIME , '"+НачМесяца+"')) AND
|(RA38027.SP38025 = _1SJOURN.IDDOC) AND (RA38027.SP38025 = DH38011.IDDOC)
|AND (DH38011.SP38005 = ' 3Z ')
|GROUP BY SC172.DESCR, RA38027.SP38025, _1SJOURN.DOCNO, _1SJOURN.DATE_TIME_IDDOC
|HAVING SUM(RA38027.SP38026*(1-2*RA38027.DEBKRED)) > 0
|ORDER BY SC172.DESCR";
Connection = Новый COMОбъект("ADODB.Connection");
//Connection.Provider = Провайдер;
Connection.ConnectionString = мдСтрокаПодключения;
//Сообщить(МойЗапрос);
Попытка
Connection.Open();
Исключение
Сообщить("Подключение - bad!");
КонецПопытки;
RS = Новый COMОбъект("ADODB.Recordset");
//RS.CursorType = 3;
RS.Open(МойЗапрос, Connection );
ТЗ=Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("КонтрагентНаименование", ПолучитьОписаниеТиповС(50),"Контрагент",30);
ТЗ.Колонки.Добавить("ИДДокумента", ПолучитьОписаниеТиповС(10));
ТЗ.Колонки.Добавить("НомерДок", ПолучитьОписаниеТиповС(10),"№ заявки",10);
ТЗ.Колонки.Добавить("ДатаДок", ПолучитьОписаниеТиповС(10),"дата заявки",10);
ТЗ.Колонки.Добавить("СуммаОстаток", ПолучитьОписаниеТиповЧ(10, 2),"Сумма",15);
Пока RS.EOF() = 0 Цикл
КонтрагентНаименование = RS.Fields("DESCR").Value;
ИДДокумента = RS.Fields("SP38025").Value;
НомерДок = RS.Fields("DOCNO").Value;
ДатаДок = RS.Fields("DATADOC").Value;
СуммаОстаток = Число(RS.Fields("Ost").Value);
Если СуммаОстаток = 0 Тогда
RS.MoveNext();
Продолжить;
КонецЕсли;
Стр=ТЗ.Добавить();
Стр.КонтрагентНаименование = КонтрагентНаименование;
Стр.ИДДокумента = ИДДокумента;
Стр.НомерДок = НомерДок;
Стр.ДатаДок = Дата(ДатаДок);
Стр.СуммаОстаток = СуммаОстаток;
RS.MoveNext();
КонецЦикла;
Категория:
COM-объекты, WMI, WSH Как Копировать Документ, имея ссылку источник? Код 1C v 8.х // Копирование документа
ДокументКопия = ИсходныйДокумент.Скопировать();
ДокументКопия.Дата = РабочаяДата;
ДокументКопия.Записать();
При применении метода Скопировать() все реквизиты нового документа получают свои значения из переменной ИсходныйДокумент. Исключение составляют значения реквизитов Дата и Проведен.
Поэтому, если копирование документа не сопровождается открытием его формы, дату нового документа лучше установить самостоятельно.
В нашем примере в качестве значения реквизита Дата устанавливаем дату, которую обычно используют для
Категория:
Документы Чтение(СрезПоследних) и Запись Регистра Сведений подчиненного регистратору(Обработка проведения) Для чтения данных из регистра сведений необходимо создать новый отбор и воспользоваться методами СрезПервых или СрезПоследних или использовать запрос как показано в примере обработки далее. Пример кода иллюстрирует эти методы:
Код 1C v 8.х Отбор = Новый Структура("ТипЦен, Номенклатура");
Отбор.ТипЦен = ТипЦены; // Какой тип цены
Отбор.Номенклатура = Номенклатура; // Для какой номенклатуры
// Цена в регистре сведений до Рабочей даты включительно
Цена = РегистрыСведений.ЦеныНоменклатуры.СрезПоследних( РабочаяДата(), Отбор);
Для записи в подчиненный регистратору регистр сведений Цены номенклатуры 1С использует механизмы проведения, а именно процедуру
Обработка Проведения , которые можно сформировать в конфигураторе, используя помощник - конструктор движений:
Код 1C v 8.х Процедура Обработка Проведения(Отказ, Режим)
Для Каждого ТекСтрокаТовары Из Товары Цикл
// регистр Цены Номенклатуры
Движение = Движения.ЦеныНоменклатуры.Добавить();
Движение.Период = Дата;
Движение.ТипЦен = ТекСтрокаТовары.ТипЦен;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.ХарактеристикаНоменклатуры = ТекСтрокаТовары.ХарактеристикаНоменклатуры;
Движение.Валюта = ТекСтрокаТовары.Валюта;
Движение.Цена = ТекСтрокаТовары.Цена;
Движение.ЕдиницаИзмерения = ТекСтрокаТовары.ЕдиницаИзмерения;
Движение.ПроцентСкидкиНаценки = ТекСтрокаТовары.ПроцентСкидкиНаценки;
Движение.СпособРасчетаЦены = ТекСтрокаТовары.СпособРасчетаЦены;
КонецЦикла;
КонецПроцедуры
Категория:
Регистры сведений Как перенести остаток со счета на счет? Код 1C v 8.х Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ХозрасчетныйОстатки.СуммаОстатокДт
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, Счет = &Счет, ,
| Субконто1 = &Контрагент И Организация = &Организация И Субконто2 = &Договор) КАК ХозрасчетныйОстатки";
// Считаем что на счете ведется аналитика только в разрезе контрагентов
// и договоров.
Запрос.УстановитьПараметр("Период", Период1);
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Запрос.УстановитьПараметр("Договор", Договор);
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("Счет", ПланыСчетов.Хозрасчетный.РасчетыСПокупателями);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Документ = Документы.ОперацияБух.СоздатьДокумент();
Документ.Дата = РабочаяДата;
Документ.Организация = Организация;
Документ.Содержание = "Погашение дебиторской задолженности";
Проводка = Документ.Движения.Хозрасчетный.Добавить();
Проводка.СчетДт = ПланыСчетов.Хозрасчетный.РасчетыСПокупателями;
Проводка.СчетКт = ПланыСчетов.Хозрасчетный.ПрочиеРасходы;
Проводка.СубконтоДт.Контрагенты = Контрагент;
Проводка.СубконтоДт.Договоры = Договор;
Проводка.Сумма = Выборка.СуммаОстатокДт;
Документ.СуммаОперации = Выборка.СуммаОстатокДт;
Форма = Документ.ПолучитьФорму();
Форма.Открыть();
КонецЕсли;
Категория:
Регистры бухгалтерии Как Выбрать Месяц формирования отчета? Код 1C v 8.х //Выберите месяц формирования
СписокМесяцев = Новый СписокЗначений;
ТекДата = НачалоМесяца(РабочаяДата);
Для Мес = -15 по 15 Цикл
ТекМес = ДобавитьМесяц(ТекДата, Мес);
СписокМесяцев.Добавить(ТекМес, Формат(ТекМес, "ДФ='ММММ гггг'"));
КонецЦикла;
ВыбранЗначение = СписокМесяцев.ВыбратьЭлемент("Выберите месяц:", СписокМесяцев.НайтиПоЗначению(ТекДата));
Если ВыбранЗначение = Неопределено Тогда
Сообщить("Месяц не выбран ");
Иначе
Сообщить("Первый день выбранного месяца: "+ ВыбранЗначение.Значение);
Сообщить("Представление выбранного месяца: "+ ВыбранЗначение.Представление);
КонецЕсли;
При выборе Май 2010 получаем:
Первый день выбранного месяца: 01.05.2010 0:00:00
Представление выбранного месяца: Май 2010
вот так это выглядит:
Категория:
Работа с Датами (Временем) Как заполнить диаграмму данными? Код 1C v 8.х Диаграмма = ЭлементыФормы.Диаграмма;
// Очистить диаграмму, возможно ранее в нее уже выводились данные.
Диаграмма.КоличествоСерий = 0;
Диаграмма.КоличествоТочек = 0;
// Количество серий будет ограничиваться (не все значения будут показываться).
Диаграмма.МаксимумСерий = МаксимумСерий.Ограничено;
Диаграмма.МаксимумСерийКоличество = 7;
Диаграмма.ВидПодписей = ВидПодписейКДиаграмме.Процент;
Диаграмма.ОбластьЗаголовка.Текст = "Обороты номенклатуры";
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ
| ПродажиКомпанииОбороты.Номенклатура,
| СУММА(ПродажиКомпанииОбороты.КоличествоОборот) КАК КоличествоОборот
|ИЗ
| РегистрНакопления.Продажи.Обороты(, , , ) КАК ПродажиКомпанииОбороты
|СГРУППИРОВАТЬ ПО
| ПродажиКомпанииОбороты.Номенклатура";
Результат = Запрос.Выполнить();
// Запретить обновление диаграммы на время вывода данных.
Диаграмма.Обновление = Ложь;
// Установить единственную точку.
Диаграмма.КоличествоТочек = 1;
Диаграмма.Точки[0].Текст = "Количество";
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
// Количество серий, если бы не ограничивали зависело бы от результата запроса.
КоличествоСерий = Диаграмма.Серии.Количество();
Диаграмма.КоличествоСерий = КоличествоСерий + 1;
Диаграмма.Серии[КоличествоСерий].Текст = Выборка.Номенклатура;
// Установить значение "на пересечении" точки и серии.
// Первый параметр - 0 , так как в диаграмме только одна точка.
Диаграмма.УстановитьЗначение(0, КоличествоСерий, Выборка.КоличествоОборот);
КонецЦикла;
// Обновить диаграмму.
Диаграмма.Обновление = Истина;
Код 1C v 7.x //Пример 1:
Процедура ПостроитьДиаграмму(Диагр)
КолСерий=0;
//количество серий определяется по количеству элементов в справочнике Материалы Спр=СоздатьОбъект("Справочник.Материалы");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 Цикл
// группы элементов пропускаются
Если Спр.ЭтоГруппа()=0 Тогда
КолСерий=КолСерий+1;
КонецЕсли;
КонецЦикла;
// установка количества серий и точек
Диагр.КоличествоСерий(КолСерий);
Диагр.КоличествоТочек(1);
//в качестве значений на диаграмме примем количественное сальдо конечное по счету 10 и текущему элементу справочника
БИ=СоздатьОбъект("БухгалтерскиеИтоги");
БИ.Рассчитать(ДатаОтчета, ДатаОтчета);
номер=1;
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 Цикл
Если Спр.ЭтоГруппа()=0 Тогда
Диагр.УстановитьИмяСерии(Номер, Спр.Наименование);
Диагр.УстановитьЗначение(1,номер,БИ.СКД("10","К",,Спр.ТекущийЭлемент()));
номер=номер+1;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Код 1C v 7.x // Пример 2:
Процедура СформироватьДиаграмму(Диаграмма1)
// Блокируем обновление, пока обрабатываются данные
Диаграмма1.Обновление(0);
Диаграмма1.Заголовок = "Поступления от покупателей";
Диаграмма1.УстановитьИмяСерии(1, "Рубли");
Диаграмма1.АвтоУстановкаИменТочек(1);
// Заполним диаграмму значениями
БухИт = СоздатьОбъект("БухгалтерскиеИтоги");
Бухит.ВыполнитьЗапрос(НачКвартала(РабочаяДата()),
КонКвартала(РабочаяДата()),"60.1",,,1,"Неделя","С");
БухИт.ВыбратьПериоды();
А = 1;
// дебетовые обороты по счету 60.1 покажут поступления
// денег от покупателей
Пока БухИт.ПолучитьПериод() = 1 Цикл
Диаграмма1.УстановитьЗначение(А, 1, БухИт.ДО());
А = А +1;
КонецЦикла;
// после наполнения данными перерисовываем
Диаграмма1.Обновление(1);
КонецПроцедуры
Категория:
Диаграмма Пример загрузки данных из Текстового файла, документа Файл для загрузки содержит данные вида(КодФизЛица, ФизЛицо, Сумма):
000000513~Петров Юрий Викторович~150
000000184~Иванов Александр Юрьевич~50
Код 1C v 8.х //Выбор файла
Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытияФайла.ПолноеИмяФайла = "";
Фильтр = "Текст(*.txt)|*.txt";
ДиалогОткрытияФайла.Фильтр = Фильтр;
ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
ДиалогОткрытияФайла.Заголовок = "Выберите файл для загрузки";
Если ДиалогОткрытияФайла.Выбрать() Тогда
ПутьКФайлу = ДиалогОткрытияФайла.ПолноеИмяФайла;
КонецЕсли;
//Выбор вида удержания пользователем
ВидУдерж=Неопределено;
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("ПланВидовРасчетаСсылка.УдержанияОрганизаций"));
ОписаниеВозможныхТипов = Новый ОписаниеТипов(МассивТипов);
Если ВвестиЗначение(ВидУдерж,"Выберите вид удержания", ОписаниеВозможныхТипов) Тогда
Если Удержания.Количество()>0 тогда
Предупреждение("Внимание! В таблице уже есть данные, новые данные Добавлены к существующим данным!");
КонецЕсли;
текдок=Новый ТекстовыйДокумент;
текдок.Прочитать(ПутьКФайлу);
Для Ном=1 по текдок.КоличествоСтрок() цикл
Стр = текдок.ПолучитьСтроку(Ном);
//Разложим строку в массив данных
СтрМ=РазложитьСтрокуВМассивПодстрок(стр,"~");
//Добавляем новую строку
НовСтр=Удержания.Добавить();
//Ищем Физика
Физик = Справочники.ФизическиеЛица.НайтиПоКоду(СтрМ[0]);
Если СокрЛП(Физик.Наименование) = СокрЛП(СтрМ[1]) тогда
НовСтр.Физлицо = Физик;
Иначе
Сообщить("В справочнике Физ. Лиц не найден "+СтрМ[1],СтатусСообщения.ОченьВажное);
КонецЕсли;
НовСтр.ВидРасчета=ВидУдерж;
НовСтр.ДатаНачала=РабочаяДата;
НовСтр.ДатаОкончания=РабочаяДата;
НовСтр.Показатель1=СтрМ[2];
НовСтр.Результат=СтрМ[2];
КонецЦикла;
КонецЕсли;
Категория:
Текстовый документ Открытие периода оперативных итогов Код 1C v 7.x // Открытие периода
ДатаТА = ПолучитьДатуТА();
Если (РабочаяДата() > ДатаТА) И ((ДатаМесяц(ДатаТА) <> ДатаМесяц(РабочаяДата())) ИЛИ (ДатаГод(ДатаТА) <> ДатаГод(РабочаяДата()))) Тогда
Если МонопольныйРежим() = 0 Тогда
Ответ=Вопрос("Не открыт период!" + РазделительСтрок + "Для открытия периода запустите программу в монопольном режиме!" + РазделительСтрок + "Завершить работу программы?","Да+Нет");
Если Ответ="Да" Тогда
СтатусВозврата(0);
Возврат;
КонецЕсли;
Иначе // монопольный режим
Ответ=Вопрос("Не открыт период!"+ РазделительСтрок +"Выполнить открытие& ;периода?","Да+Нет");
Если Ответ="Да" Тогда
УстановитьТАНа(РабочаяДата());
КонецЕсли;
КонецЕсли;
КонецЕсли;
Категория:
Полезные, Универсальные Функции Получение остатков регистра запросом, с группировкой по продукту и цене Код 1C v 7.x ДатаК=РабочаяДата();
Запрос=СоздатьОбъект("Запрос");
ТекстЗапроса=
"//{{ЗАПРОС(ОстаткиТоваров)
|Период с '01.01.1990' по ДатаК;
|Продукт=Регистр.ПродОст.Продукция;
|Цена=Регистр.ПродОст.Цена;
|Колво=Регистр.ПродОст.Количество;
|Вес=Регистр.ПродОст.Вес;
|Функция КолвоНачОст=НачОст(КолВо);
|Функция КолвоПриход=Приход(КолВо);
|Функция КолвоРасход=Расход(КолВо);
|Функция КолвоКонОст=КонОст(КолВо);
|Функция ВесНачОст=НачОст(Вес);
|Функция ВесПриход=Приход(Вес);
|Функция ВесРасход=Расход(Вес);
|Функция ВесКонОст=КонОст(Вес);
|Группировка Продукт;
|Группировка Цена;
|"//}}ЗАПРОС
;
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
Сообщить("1");
//... код вывода
Пока Запрос.Группировка("Продукт") = 1 Цикл
Сообщить("2");
//... код вывода
Пока Запрос.Группировка("Продукт") = 1 Цикл
Сообщить("3");
//... код вывода
КонецЦикла;
КонецЦикла;
Сообщить("4");
//... код вывода
Категория:
Регистры Пример присвоения нового номера, при проблемах с нумерацией Пример реализации автоматич. расчета следующего номера, нумерация
Предположим, у документа
Начисление Отпуска слетела нумерация, кто-то влез и ручками исправил номер документа
Самый простой способ исправить ситуацию - найти документ с некорректным номером и изменить в нем номер на правильный.
Или можно перенумеровать воспользовавшись специальными обработками -
https://helpf.pro/files/view/8.html
https://helpf.pro/files/view/11.html
Ну а если найти некорректный документ не удается, а использовать обработки перенумерации нежелательно, тогда:
в модуле документа, у которого слетела нумерация, в процедуре
Код 1C v 7.x Процедура ВводНового(Копирование)
добавить (пример для документа "НачислениеОтпуска" ):
Код 1C v 7.x
//E_Migachev автоматический расчет следующего номера
//Выберем документы в обратном порядке
ДокНачислениеОтпуска = СоздатьОбъект("Документ.НачислениеОтпуска");
ДокНачислениеОтпуска.ОбратныйПорядок(1);
ДокНачислениеОтпуска.ВыбратьДокументы(НачКвартала(РабочаяДата()-15),КонКвартала(РабочаяДата()+27));
ДокНачислениеОтпуска.ПолучитьДокумент();
//Получим последний числовой номер
новномдк=Строка(число(Сред(ДокНачислениеОтпуска.НомерДок,3,7)));
стрдлинаномдк=СтрДлина(Строка(СокрЛП(Сред(ДокНачислениеОтпуска.НомерДок,3,7))));
новномдк=Число(новномдк)+1;
иткол=стрдлинаномдк-СтрДлина(новномдк);
префиксдк="ОТ";
если иткол>0 тогда
для н=1 по иткол цикл
префиксдк=префиксдк+строка(0);
конеццикла;
конецесли;
докном=префиксдк+новномдк;
//Если документ исправление то нужен префикс И
Если Исправление=1 Тогда
знтри=Прав(ДокНачислениеОтпуска.НомерДок,3);
Если Строка(Лев(знтри,1))="И" Тогда
чзнтри=Число(Прав(знтри,2));
чзнтри=чзнтри+1;
Иначе
чзнтри=1;
КонецЕсли;
Если СтрДлина(чзнтри)=1 Тогда
докном=докном+"-И0"+Строка(чзнтри);
Иначе
докном=докном+"-И"+Строка(чзнтри);
КонецЕсли;
КонецЕсли;
//Присвоим новый номер
НомерДок=докном; //E_Migachev автоматич расчет номера
Категория:
1С Общие вопросы - Обычные формы