Предложило мне тут приложение HH оставить отзывы о работодателях, у которых пришлось в своё время поработать. Попытался оставить. Как итог: положительные отзывы публикуются моментально. Отрицательные — вот уже пару недель пытаюсь опубликовать, и все не проходят модерацию. Но я упорный. всё время меняю формулировки.. надеюсь кому то из модераторов надоест уже это и нажмут кнопку «пропустить».
P.S. Ну собственно это и ожидаемо, полистал несколько «работодателей» — плохих отзывов нет. Хотя точно знаю, что компания шлак.
Как то упустил эту возможность платформы 1С и никогда ранее не использовал. А тут вдруг прилетела задача поработать файлами большого размера (xlsx, csv), на основании данных в которых нужно строить различного вида отчёты. Пришла мысль: а почему бы не загрузить данные этих файлов в БД, а затем уже спокойно стоить на основании этих данных отчёты. Какие-то регистры, справочники и т.п. создавать в конфигурации для этого посчитал излишним. Самое правильное, подумал я, хранить всё вообще в какой-то сторонней базе (в моём случае в PostgreSQL). А 1С использовать только для вывода и формирования отчётов. Вот тут то я и вспомнил, что когда то мельком читал про «внешние источники данных» в 1С. Значит пришло время попробовать хранение информации во внешних источниках данных.
Сначала создам БД, с таблицами ls и shemes со структурой вида::
, где id — автоинкримент типа integer. Забегая вперед, следует отметить, что 1С не умеет при добавлении данных во внешние источники данных, передавать инкрементальное значение, а потому создадим триггер, который будет выполнятся перед транзакцией запроса INSERT, и заменяет значение id, на следующее по порядку:
Подготовка закончена. Теперь подготовим платформу 1С. А именно необходимо установить драйвер ODBC. Под Linux ставим из репозитария, под Windows скачиваем и устанавливаем отсюда: https://www.postgresql.org/ftp/odbc/releases/REL-16_00_0005-mimalloc/
Далее необходимо зайти в конфигуратор 1С и добавить новый источник данных и таблицу в нём. При создании таблицы, необходимо выбрать «Выбрать из списка таблиц внешнего источника данных», и построить строку соединения с БД, вида:
После чего, будут доступны для добавления в конфигуратор таблицы БД:
После того как нажмем «Готово», в конфигураторе будет что-то вроде:
Далее остаётся научится читать,писать и удалять эти данные:
// добвление
новыелс=внешниеисточникиданных.ОтчетыДля1С.Таблицы.reports_1c_public_ls.СоздатьОбъект();
новыелс.name="4232344";
новыелс.Записать();
// изменение
мХарактеристика = внешниеисточникиданных.ОтчетыДля1С.Таблицы.reports_1c_public_ls.НайтиПоПолю("id",3);
мОбъект = мХарактеристика.ПолучитьОбъект();
мОбъект.name = "Уря! Чебуршка родил слона!";
мОбъект.Записать();
//удаление
мХарактеристика = внешниеисточникиданных.ОтчетыДля1С.Таблицы.reports_1c_public_ls.НайтиПоПолю("id",3);
мОбъект = мХарактеристика.ПолучитьОбъект();
мОбъект.Удалить();
// чтение
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| reports_1c_public_ls.id КАК id,
| reports_1c_public_ls.name КАК name,
| reports_1c_public_shemes.name КАК name1
|ИЗ
| ВнешнийИсточникДанных.ОтчетыДля1С.Таблица.reports_1c_public_ls КАК reports_1c_public_ls
| ЛЕВОЕ СОЕДИНЕНИЕ ВнешнийИсточникДанных.ОтчетыДля1С.Таблица.reports_1c_public_shemes КАК reports_1c_public_shemes
| ПО reports_1c_public_ls.sheme = reports_1c_public_shemes.id";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
сообщить(ВыборкаДетальныеЗаписи.name);
сообщить(ВыборкаДетальныеЗаписи.name1);
КонецЦикла;
Update 16/09/2025: таки автоувеличение идентификатора умеет. Достаточно его указать как «только чтение» в 1С:
Задача: на нескольких серверах ограничить доступ к сайту по протоколу http/https для всех, кроме избранных IP.
Решить можно несколькими способами:
поправить .htaccess, добавив в него deny from all и allow from IP
на уровне файревола
Мне предпочтительней было сделать это на уровне файревола, т.к. таким образом не нужно прописывать запрет на доступ на каждом сайте, а запрещаю на ВСЕХ сайтах размещенных на этом сервере одновременно.
Принцип прописывания правил для всех файреволов одинаков: запрещаем по умолчанию всё, кроме того что нужно. Так как у меня немного зоопарк по серверам, то два различных файревола.
Ubuntu и иже с ним:
ufw default deny outgoing
ufw default deny incoming
ufw allow out 53
ufw allow from 19.82.24.12 to any port 443
ufw allow from 19.82.34.12 to any port 80
service ufw restart
Задача: создать силами платформы 1c файл в формате DBF (выгрузка в формате dbf)
Решение: собственно в 1С всё есть. Будем использовать метод XBase. При работе с DBF важно помнить, что это очень старый формат хранения данных, но тем не менее до сих пор используется для различного вида обменов. Его ограничениями являются:
длина имени файлов не более 8 символов, поэтому при генерации имени временного файла, не получится использовать функцию ПолучитьИмяВременногоФайла()
файл не должен быть больше 2ггб
имя колонки не может быть длиннее 10 символов
файл создается НЕ в кодировке UTF-8 (он в такую не умеет)
файл нужно сначала создать, потом закрыть, потом открыть и записать в него данные
Несколько статей уже на моём сайте на эту тему есть вывод отчета из макета), но они слегка протухли за прошедшее время, и почему-то отображаются не вполне корректно. Потому повторю.
Сначала нужно создать макет:
Нарисуем структуру отчета, присвоим имена блокам, обозначим ячейки которые будут заполнятся параметрами.
Далее на клиенте на форму выведем кнопку, и на неё повесим на неё обработчик заполнения отчета и вывода его на экран:
&НаКлиенте
Процедура СформироватьОтчёт(Команда)
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент=ПечатнаяФормаНаСервере();
ТабличныйДокумент.Показать();
КонецПроцедуры
Формирование и вывод отчета из макета:
&НаСервере
Функция ПечатнаяФормаНаСервере()
ТабДок=Новый ТабличныйДокумент;
Макет=РеквизитФормыВЗначение("Объект").ПолучитьМакет("МакетУдовлетворённость");
ОбластьШапка=Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(ОбластьШапка);
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ОбластьТушка=Макет.ПолучитьОбласть("тушка");
ОбластьТушка.Параметры.ид=ВыборкаДетальныеЗаписи.ИдентификаторОпроса;
ТабДок.Вывести(ОбластьТушка);
КонецЦикла;
...
возврат ТабДок;
КонецФункции