Количество рабочих и выходных дней в месяце с сайта its.1c.ru

22.11.17

Разработка - Универсальные функции

Простенькая функция, которая обращается к сайту ИТС и возвращает оттуда сведения о количестве рабочих дней в указанном месяце. Платформа 8.3.10, УФ.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Количество рабочих и выходных дней в месяце с сайта its.1c.ru:
.epf 7,63Kb
2
2 Скачать (1 SM) Купить за 1 850 руб.

Понадобилось для своей конфигурации тупо посмотреть, сколько рабочих дней было в месяце. Заводить из-за этого свой или подключать БСП-шный календарь, графики рабочего времени с учётом переносов выходных и праздников, обеспечивать их актуальность - 8 килограмм проблем - лень.

Вот и решил сделать такую простенькую функцию, которая ходила бы на сайт ИТС и оттуда бы забирала эти данные, благо они в открытом доступе...

Функция делает простое обращение по https к сайту ИТС (its.1c.ru) и забирает оттуда информацию, связанную с календарём бухгалтера. Так как эта информация лежит в открытом доступе, логин и пароль к сайту ИТС не требуется. В качестве страницы, к которой происходит обращение, указывается путь /calendar/YYMM. Выполняется простой парсинг полученного ответа: находятся строки, содержащие текст "Календарных дней", "Рабочих дней", "Рабочих часов", "Выходных и праздничных дней". Если на сайте нет информации о каком-либо месяце, то и ответ будет невразумительный. Например, на сегодняшний день (22.11.2017) доступны сведения о календаре бухгалтера с декабря 2011 года по декабрь 2017 года. Видимо, более ранних сведений просто нет, а календарь на следующий год ИТС-ники пока не удосужились ввести на сайт. В этом случае функция выдаст ошибку, в возвращаемой структуре будут нули. Чтобы избежать ошибок, если они существуют на сайте (да-да, челофактор повсюду!), сделаны простенькие проверки. Ну, сами посмотрите, всё прозрачно.

Косячки немножко есть, знаю - фукнцию можно легко оптимизнуть, не судите строго.

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

Вот как-то так:

// Сведения о нужном месяце с сайта ИТС.
// Параметр - сам месяц в формате даты (год тоже нужен).
// Возвращаемое - структура с числовыми полями:
// 		КолвоКалендарных
// 		КолвоРабочих
// 		КолвоВыходных
// 		КолвоРабочихЧасов
// если что-то не так, - в возвращаемых значениях "0".
&НаКлиенте
Функция ПолучитьКалендарныеДанныеСайтаИТС(Мес)
	// Соединение устанавливаем по HTTPS, иначе не работает:
	Соед = Новый HTTPСоединение("its.1c.ru", 443,,,,, Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows(СпособВыбораСертификатаWindows.Авто), Новый СертификатыУдостоверяющихЦентровWindows()),);
	// Сформируем нужную папку для запроса, добавим в правильном формате месяц и год:
	ВебЗапр = Новый HTTPЗапрос("calendar/"+Формат(Мес,"ДФ=yyMM"));
	// Пробуем достучаться до сервера:
	Попытка
		Результат = Соед.Получить(ВебЗапр);
	Исключение
		Сообщить("Ошибка соединения: Что-то не так с обращением к сайту its.1c.ru. Возможно, сервер недоступен. Или что-то с интернетом.");
		ВызватьИсключение;   // Ну пусть пока так будет...
	КонецПопытки; 
	// До сервера может и достучалось, но какие-то проблемы со страницей:
	Если Результат.КодСостояния >= 300 Тогда
		Сообщить("Ошибка: Что-то не так с обращением к странице. Возможно, календарь бухгалтера для этого месяца не определён.");
		ДанныеМесяца = новый структура;
		ДанныеМесяца.Вставить("КолвоКалендарных", 0);
		ДанныеМесяца.Вставить("КолвоРабочих", 0);
		ДанныеМесяца.Вставить("КолвоВыходных", 0);
		ДанныеМесяца.Вставить("КолвоРабочихЧасов", 0);
		Возврат ДанныеМесяца;
	КонецЕсли;
	// Пока всё норм, получаем текст страницы. Просто для удобства:
	Резуль = Результат.ПолучитьТелоКакСтроку();
	// Находим нужные позиции (они могут идти и не в такой последовательности!!!):
	ПозКД = СтрНайти(Резуль, "Календарных дней");             // Календарных дней
	ПозРД = СтрНайти(Резуль, "Рабочих дней");                 // Рабочих дней
	ПозВД = СтрНайти(Резуль, "Выходных и праздничных дней");  // Выходных дней
	ПозРЧ = СтрНайти(Резуль, "Рабочих часов");                // Рабочих часов при 40-часовой рабочей неделе - убить их мало: то ошибку в строке сделают, то дефис забудут... Ну... Чем богаты.
	// Периодически они после цифр втыкали лишний пробел, поэтому на всякий случай "СокрЛП", см., напр, март 2017. Считаем концом строки текст "<br>":
	Если ПозКД Тогда КвоКД = СокрЛП(Сред(Резуль, ПозКД+19, СтрНайти(Резуль, "<br>", , ПозКД) - (ПозКД + 19))); Иначе КвоКД = "0"; КонецЕсли;
	Если ПозРД Тогда КвоРД = СокрЛП(Сред(Резуль, ПозРД+15, СтрНайти(Резуль, "<br>", , ПозРД) - (ПозРД + 15))); Иначе КвоРД = "0"; КонецЕсли;
	Если ПозВД Тогда КвоВД = СокрЛП(Сред(Резуль, ПозВД+30, СтрНайти(Резуль, "<br>", , ПозВД) - (ПозВД + 30))); Иначе КвоВД = "0"; КонецЕсли;
	Если ПозРЧ Тогда КвоРЧ = СокрЛП(Сред(Резуль, ПозРЧ+46, СтрНайти(Резуль, "<br>", , ПозРЧ) - (ПозРЧ + 46))); Иначе КвоРЧ = "0"; КонецЕсли;
	// Ну пробуем, чо:
	Попытка ККД = Число(КвоКД); Исключение ККД = 0; КонецПопытки;
	Попытка КРД = Число(КвоРД); Исключение КРД = 0; КонецПопытки;
	Попытка КВД = Число(КвоВД); Исключение КВД = 0; КонецПопытки;
	Попытка КРЧ = Число(КвоРЧ); Исключение КРЧ = 0; КонецПопытки;
	// Структура с данными:
	ДанныеМесяца = новый структура;
	ДанныеМесяца.Вставить("КолвоКалендарных", ККД);
	ДанныеМесяца.Вставить("КолвоРабочих", КРД);
	ДанныеМесяца.Вставить("КолвоВыходных", КВД);
	ДанныеМесяца.Вставить("КолвоРабочихЧасов", КРЧ);
	// Возвращаем:
	Возврат ДанныеМесяца;
КонецФункции

В обработке в качестве примера всё реализовано целиком.

Функция календарь рабочие дни выходные дни месяц с сайта ИТС its.1c.ru

См. также

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    16623    dimanich70    81    

134

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    3793    3    John_d    11    

57

Универсальные функции Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    13612    atdonya    23    

55

Универсальные функции Программист Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    5199    ke.92@mail.ru    16    

65

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    13413    YA_418728146    7    

165

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    3254    52    progmaster    8    

4

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    18010    160    sapervodichka    112    

134
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. 🅵🅾️🆇 524 26.11.17 12:41 Сейчас в теме
На вскидку небольшие придирки:

Скрытый текст
bohdan-k; +1 Ответить
2. 🅵🅾️🆇 524 26.11.17 23:34 Сейчас в теме
(1) Также очень бы рекомендовал разбирать HTML страницу через DOM, это будет и быстрее и точнее и не будет: "// убить их мало".
Если не умеете, то советую быстренько пройти последние модули по JS на SoloLearn (все бесплатно, есть приложение на ведроид), займет час максимум, но качество возрастет в разы. Я этому научился сидя на, пардон, унитазе со смартфона :3 В общем это просто необходимый момент для парсинга. И таким образом можно было бы разобрать не примечание снизу, а сам календарь-таблицу, получая описания для каждого дня.
bohdan-k; PetrPan; a_a_burlakov; simplysimply; Coole; +5 Ответить
4. simplysimply 22 27.11.17 07:51 Сейчас в теме
(2)
Спасибо, посмотрю.
На предыдущий коммент - Вы, наверно, абсолютно правы во всех придирках, но функция представляется очень малозначимой, поэтому пост править не буду, пусть уж так.
5. 🅵🅾️🆇 524 27.11.17 09:59 Сейчас в теме
(4) Если очень кратенько, то вам жизнено необходимо научиться делать примерно так:
Массив1 = Элементы.ПолеHTML.document.getElementsByTagName("div");
Массив2 = Элементы.ПолеHTML.document.getElementsByClassName("myClass");
Элемент = Элементы.ПолеHTML.document.getElementById("myID");

Потренироваться можно нажав F12 в браузере и открыв вкладку с консолью и элементами страницы. Разбирать лучше всеже так, при этом представляя, что вы разработчик того сайта готовый прям сейчас поменять контент и предугадывая какие тэги, классы и id остануться без изменений.

Еще есть такое:
ЧтениеHTML = Новый ЧтениеHTML;
ЧтениеHTML.ОткрытьФайл(АдресСсылки, "windows-1251");
ПостроительDOM = Новый ПостроительDOM;
ДокументHTML = ПостроительDOM.Прочитать(ЧтениеHTML);
ЭлементыDOM = ДокументHTML.ПолучитьЭлементыПоИмени("div");
// ПолучитьЭлементПоИдентификатору("id") 
Для Каждого ЭлементDOM Из ЭлементыDOM Цикл
 ...
КонецЦикла;
Показать


Ну и все в таком духе :3

PS: мог в синтаксисе гденить немног абшибиться, но идея в целом такая)
1с не так силен в парсинге-скрапинге, как скажем, Python библиотека lxml. Но в целом и им можно добиться очень неплохих результатов и разобрать очень многое.
bohdan-k; a_a_burlakov; +2 Ответить
6. simplysimply 22 27.11.17 10:33 Сейчас в теме
3. пользователь 27.11.17 00:09
Сообщение было скрыто модератором.
...
7. vechiy 35 15.02.24 12:49 Сейчас в теме
не работает ни на одном из месяцев.
Прикрепленные файлы:
Оставьте свое сообщение