ch
Feedback
1С:Предприятие 8

1С:Предприятие 8

前往频道在 Telegram

🔥 Разработка в 1С — просто и понятно! 🔥 ✅ Полезные фишки и лайфхаки для разработчиков ✅ Объяснение сложных тем простыми словами ✅ Готовые решения, сниппеты и примеры кода ✅ Разбор ошибок и способов их устранения ✅ Новости и тренды в мире 1С

显示更多
879
订阅者
无数据24 小时
+17
-230
帖子存档
Работа с CSV. Выгрузка в файл CSV и его создание в 1С 8.3

&НаСервере
Процедура ВыгрузкаВФайлCSVСоздание();

   ИспользуемыйРазделитель = ";";
   ФайлCSV="D:\import_07042025.csv";

   //*** Получаем данные из запроса ***
   Запрос = Новый Запрос;
   Запрос.Текст =
   "ВЫБРАТЬ
    | ВнутреннийПрайс.Код КАК Код,
    | ВнутреннийПрайс.Наименование КАК Наименование,
    | ВнутреннийПрайс.ЗакупочнаяЦена КАК ЗакупочнаяЦена,
    | ВнутреннийПрайс.РозничнаяЦена КАК РозничнаяЦена,
    | ВнутреннийПрайс.ОптоваяЦена КАК ОптоваяЦена
    |ИЗ
    | Справочник.Цены КАК ВнутреннийПрайс";
   РезультатЗапроса = Запрос.Выполнить().Выгрузить();
   ТЗ = РезультатЗапроса;
   //**********************************

   ТекстCSV=""; // Текст с учетом заголовков, разделителей и переноса строк
   Для Каждого СтрокаТЗ Из ТЗ Цикл

       Если ТекстCSV="" Тогда

           СтрокаКол="";
           КолонкиТЗ=ТЗ.Колонки;
           Для Каждого Колонка Из КолонкиТЗ Цикл
               СтрокаКол = "" + СтрокаКол + Колонка.Имя + ИспользуемыйРазделитель ;
           КонецЦикла;
           ТекстCSV = СтрокаКол + Символы.ПС;

       КонецЕсли;

       ТекстCSV = ТекстCSV + СтрокаТЗ.Код + ИспользуемыйРазделитель + СтрокаТЗ.Наименование
       + ИспользуемыйРазделитель + СтрокаТЗ.ЗакупочнаяЦена + ИспользуемыйРазделитель + СтрокаТЗ.РозничнаяЦена
       + ИспользуемыйРазделитель + СтрокаТЗ.ОптоваяЦена + Символы.ПС;

   КонецЦикла;

   КодANSI = КодировкаТекста.ANSI;
   ТекстовыйФайлЗапись = Новый ЗаписьТекста(ФайлCSV, КодANSI); // Создание файла CSV
   ТекстовыйФайлЗапись.ЗаписатьСтроку(ТекстCSV); // Запись информации в файл
   ТекстовыйФайлЗапись.Закрыть(); // Обязательно закрываем, иначе зависает в процессе

КонецПроцедуры
👉@DevLab1C

Работа с CSV

Чтение файла CSV в 1С 8.3:

&НаКлиенте
Процедура ЧтениеФайлаCSV()

   ФайлCSV = Новый ТекстовыйДокумент;
   ФайлCSV.Прочитать("D:\import_04042025.csv");
   ЗагрузитьCSV(ФайлCSV);

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


Загрузка CSV файла (в Таблицу значений) в 1С 8.3:

&НаСервере
Процедура ЗагрузитьCSV(ФайлCSV)

   ТЗ = Новый ТаблицаЗначений;
   // Важно! Чтобы в значениях НЕ встречался используемый разделитель
   ИспользуемыйРазделитель = ";";

   //*** Если есть шапка таблицы ***
   ШапкаCSV = ФайлCSV.ПолучитьСтроку(1);
   // Чтение и разделение на отдельные значения в массив (по разделителю)
   МассивCSV = СтрРазделить(ШапкаCSV, ИспользуемыйРазделитель);
   //***************************

   Для Каждого СтрокаНом Из МассивCSV Цикл

       // Удаляем пробелы т.к. в названии столбцов они не допускаются
       ИмяБП = СтрЗаменить(СтрокаНом," ","");
       ТЗ.Колонки.Добавить(ИмяБП,, СтрокаНом);

   КонецЦикла;

   Для НомерСтроки=2 По ФайлCSV.КоличествоСтрок() Цикл // Если без шапки, то начинаем с первой строчки

       // Получаем строку по-порядку
       СтрокаCSV = ФайлCSV.ПолучитьСтроку(НомерСтроки);

       // Разделяем с помощью выбранного разделителя каждую строку на столбцы
       МассивCSV = СтрРазделить(СтрокаCSV, ИспользуемыйРазделитель);
       НоваяСтрочка= ТЗ.Добавить();// Добавляем строку в ТЗ

       Для НомСтолбца= 1 По МассивCSV.Количество() Цикл

           ТекЗначениеCSV = МассивCSV[НомСтолбца-1];
           ИмяКолонкиCSV = ТЗ.Колонки[НомСтолбца-1].Имя;
           НоваяСтрочка[ИмяКолонкиCSV] = ТекЗначениеCSV;

       КонецЦикла;

   КонецЦикла;

КонецПроцедуры
👉@DevLab1C

Сохранение, чтение и удаление настроек пользователя в 1С 8.3

&НаСервере
Процедура СохранениеЧтениеУдалениеНастроекПользователя()

    // Сохранение произвольных настроек конкретного пользователя
    НастройкиПользователя = Новый Структура;
    НастройкиПользователя.Вставить("Фамилия", "Дарк");
    НастройкиПользователя.Вставить("Имя", "Жанна");
    НастройкиПользователя.Вставить("Пол", "Ж");
    НастройкиПользователя.Вставить("Возраст", 19);

    // Параметры: Ключ объекта, Ключ настроек, Настройки, Описание настроек, Владелец настроек,
    ХранилищеОбщихНастроек.Сохранить("Отчет.ОСВ", "КлючНастроек", НастройкиПользователя, ,ИмяПользователя());

    // Сохранение произвольных настроек для всех пользователей
    ВсеПользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
    Для Каждого Пользователь Из ВсеПользователи Цикл
        ХранилищеОбщихНастроек.Сохранить("Отчет.ОСВ", "КлючНастроек", НастройкиПользователя, ,Пользователь.Имя);
    КонецЦикла;

    // Чтение сохраненных настроек пользователя
    ЧтениеНастроек = Неопределено;
    Попытка
        ЧтениеНастроек = ХранилищеОбщихНастроек.Загрузить("Отчет.ОСВ", "КлючНастроек",,ИмяПользователя());
    Исключение
        Сообщить("Не достаточно прав доступа к настройкам пользователя: "+ИмяПользователя());
    КонецПопытки;

    Если ЧтениеНастроек = Неопределено Тогда // Значит настроек нет
        Сообщить("Не получилось прочитать настройки.");
    Иначе // Чтение настроек
        Сообщить("Имя:"+ЧтениеНастроек.Имя+"; Фамилия:"+ЧтениеНастроек.Фамилия+
        "; Пол:"+ЧтениеНастроек.Пол+"; Возраст:"+ЧтениеНастроек.Возраст);
    КонецЕсли;

    // Удаление сохраненных настроек пользователя
    ХранилищеОбщихНастроек.Удалить("Отчет.ОСВ", "КлючНастроек", ИмяПользователя());

    // Удаление сохраненных настроек у всех пользователей
    ХранилищеОбщихНастроек.Удалить("Отчет.ОСВ", "КлючНастроек", Неопределено);

КонецПроцедуры
👉@DevLab1C

Чтение и проверка прав и ролей пользователей в 1С 8.3

&НаСервере
Процедура ЧтениеИПроверкаПравИРолейПользователей() // Варианты прав: Чтение, Изменение, Добавление, Удаление, Проведение

    // Чтение права к объекту метаданных у текущего пользователя
    Если ПравоДоступа("Изменение", Метаданные.Справочники.Материалы) Тогда
        Сообщить("Доступ к справочнику Материалы на изменение открыт!");
    КонецЕсли;

    // Чтение права к объекту метаданных у определенной роли
    Если Не ПравоДоступа("Удаление", Метаданные.Справочники.Материалы, Метаданные.Роли.Менеджер) Тогда
        Сообщить("У роли Менеджер нет прав на удаление в справочнике Материалы!");
    КонецЕсли;

    // Проверка права к объекту метаданных у других пользователей
    ВсеПользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
    Для Каждого Пользователь Из ВсеПользователи Цикл
        Если ПравоДоступа("Изменение", Метаданные.Справочники.Материалы, Пользователь) Тогда
            Сообщить("Доступ для " + Пользователь.Имя + " на изменение открыт!");
        КонецЕсли;
    КонецЦикла;

    // Чтение роли у текущего пользователя
    Если РольДоступна("Администратор") Тогда
        Сообщить("У Вас права Администратора!");
    КонецЕсли;

    // Проверка права у пользователя и в случае его отсутствия - вызов исключения
    ВыполнитьПроверкуПравДоступа("Изменение", Метаданные.Справочники.Материалы); // "Нарушение прав доступа!"

КонецПроцедуры
👉@DevLab1C

Создать, удалить пользователя, вывести список пользователей в 1С 8.3

Процедура СоздатьПользователя()

   ПользовательИБ = ПользователиИнформационнойБазы.СоздатьПользователя();
   ПользовательИБ.Имя = "odin1Crus";
   ПользовательИБ.Пароль = "4dSwer4";
   ПользовательИБ.ПоказыватьВСпискеВыбора = Истина;
   ПользовательИБ.Роли.Добавить(Метаданные.Роли.АдминистраторСистемы);
   ПользовательИБ.ОсновнойИнтерфейс = Метаданные.Интерфейсы.Основной;
   ПользовательИБ.Записать();

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


Процедура УдалитьПользователя()

   ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени("odin1Crus");
   ПользовательИБ.Удалить();

   //ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
   //ПользовательИБ.Удалить();

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


Процедура ВывестиСписокПользователей()

   СписокПользователей = ПользователиИнформационнойБазы.ПолучитьПользователей();
   Для Каждого ПользовательИБ Из СписокПользователей Цикл
       Сообщить(ПользовательИБ);
   КонецЦикла;

КонецПроцедуры
👉@DevLab1C

Получить каталог Мои документы в 1С 8.3

&НаСервере
Функция ПолучитьКаталогМоиДокументы()

    МояОбработка = ЭтотОбъект.Метаданные().ПолноеИмя();
    КаталогMyDocuments = ХранилищеНастроекДанныхФорм.Загрузить(МояОбработка, "КаталогСохранения");

    Если ПустаяСтрока(КаталогMyDocuments) Тогда // не заполнен
        WScript = Новый COMОбъект("WScript.Shell");
        КаталогMyDocuments = WScript.SpecialFolders().Item("MyDocuments");
        WScript = Неопределено;
    КонецЕсли;

    Возврат КаталогMyDocuments;

КонецФункции
Представленная функция универсальная и рекомендуется к использованию на любой версии платформы. Также существуют и штатные методы платформы который также можно использовать для решения данной задачи. 👉@DevLab1C

Ускорение и оптимизация 1С. Базовый курс (2022) 5 примеров ошибок в коде, которые приводят к замедлению работы 1С Почему документ с одной строкой проводится 7,5 секунд Как исправить ошибку при запуске после внедрения подсистемы Оценка производительности из БСП Как ускорить процесс реструктуризации и обновления 1С в разы 3 принципа работы блокировок, о которых стоит знать каждому программисту 1С Как «поймать» медленные запросы Все видео на youtube 👉@DevLab1C

Универсальные коллекции значений 1С Ильяс Низамутдинов Урок №1. Массивы Урок №2. Структура Урок №3. Соответствие Урок №4. Список значений Урок №5. Таблица значений Урок №6. Дерево значений Урок №7.Бинарный поиск по таблице значений 1С Все видео на youtube 👉@DevLab1C

Как быстро сохранить огромный отчет в EXCEL? Иногда бывает так, что отчет очень большой (> 65535 строк), а работать с этим всем нужно через EXCEL - 1С такой отчет в xls не сохранит. Да и отчеты с меньшим количеством строк сохраняются в xls-файл очень долго. Приведенная здесь небольшая хитрость поможет Вам сохранять для EXCEL таблицы с бОльшим количество строк и делать это быстрее. Выведите отчет, идем в меню Файл-Сохранить копию и выбираем тип "Документ HTML4". Файл сохранится быстрее, чем в xls, и его корректно откроет EXCEL. Потом можно в EXCEL пересохранить в xls или xlsx. 👉@DevLab1C

Архивирование файлов средствами 1C (ZIP) Код 1C v 8.х ИмяZIPФайла = ПолучитьИмяВременногоФайла(".zip"); ФайлАрхива = Новый За
Архивирование файлов средствами 1C (ZIP) Код 1C v 8.х ИмяZIPФайла = ПолучитьИмяВременногоФайла(".zip"); ФайлАрхива = Новый ЗаписьZipФайла(ИмяZIPФайла, , , МетодСжатияZIP.Сжатие, УровеньСжатияZIP.Оптимальный); ФайлАрхива.Добавить(ИмяВременногоФайла, РежимСохраненияПутейZIP.СохранятьОтносительныеПути, РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно); ФайлАрхива.Записать(); 👉@DevLab1C

Отладка под определенным пользователем Чтобы запускать 1С в режиме отладки из конфигуратора от имени другого пользователя, мо
Отладка под определенным пользователем Чтобы запускать 1С в режиме отладки из конфигуратора от имени другого пользователя, можно задать нужного пользователя в параметрах конфигуратора (меню Сервис – Параметры) на вкладке "Запуск 1С: Предприятия": 👉@DevLab1C

Глюки платформы. Почему нельзя добавить команду «Перейти» к нужному регистру Если на форме документа нельзя добавить команду
+1
Глюки платформы. Почему нельзя добавить команду «Перейти» к нужному регистру Если на форме документа нельзя добавить команду "Перейти" - "Остатки номенклатуры" или любого другого регистра, то нужно открыть свойства нужного регистра и снять-поставить галку "Использовать стандартные команды". Это глюк платформы. 👉@DevLab1C

Как быстро поменять название процедуры, назначенной на событие Бывает так что имя процедуры слишком длинное или оно устарело.
Как быстро поменять название процедуры, назначенной на событие Бывает так что имя процедуры слишком длинное или оно устарело. А чтобы его поменять – нужно изменить и название процедуры в коде и исправить её название в обработчике события. Для быстрого изменения же следует делать это в поле с именем процедуры в событии. При изменении 1С предложит поменять имя процедуры: И при нажатии «Да» имя процедуры изменится и в коде. Таким образом можно быстро выполнять рефакторинг. 👉@DevLab1C

Как разрешить выбирать в поле на форме номенклатуру только типа «Комплект» (или другое условие) Рассмотрим на примере докумен
Как разрешить выбирать в поле на форме номенклатуру только типа «Комплект» (или другое условие) Рассмотрим на примере документа «Изменение состава комплекта» из сертификационного экзамена 1С: Специалист по платформе. У него есть реквизит «Комплект» с типом «Номенклатура». Нужно сделать так чтобы в этом поле пользователь мог выбирать номенклатуру только с видом номенклатуры «Комплект». Для этого нужно у этого реквизита в свойствах указать Параметры выбора Отбор.ВидНоменклатуры(Комплект): Таким образом больше не нужно ничего писать в коде для гарантии того что пользователь сможет выбирать только комплекты. 👉@DevLab1C

Быстрый поиск по фразе в коде (CTRL+F3) Если в коде нужно быстро найти какую-то фразу, можно выделить её и нажать CTRL + F3,
Быстрый поиск по фразе в коде (CTRL+F3) Если в коде нужно быстро найти какую-то фразу, можно выделить её и нажать CTRL + F3, тогда она автоматически подставится в поле поиска сверху и нажатием F3 можно будет переходить по всем местам этой фразы в коде. Таким образом мы экономим время на копирование фразы (кстати, фразу можно быстро выделить, зажав CTRL и щелкнув внутри фразы), а также на перемещение мышью и вставку этого текста в поле поиска. 👉@DevLab1C

Настройка работы 1С Предприятия 8.3 с использованием PostgreSQL в среде Linux 👉@DevLab1C

Восстановить положение окна программно Процедура ПередОткрытием(Отказ, СтандартнаяОбработка) ЭтаФорма.ИмяСохраненияПоложенияОкна = Новый УникальныйИдентификатор(); КонецПроцедуры 👉@DevLab1C

В Конфигураторе, между редактором формы и текстом модуля, можно быстро переключаться без помощи мыши Для управляемых форм Alt+1 (форма) и Alt+2 (модуль). Для обычных форм Ctrl+PageDown и Ctrl+PageUp вперед и назад по вкладкам. 👉@DevLab1C

Фильтрация таблицы значений С помощью построителя запросов // ТаблицаОтборов - Таблица значений с колонками // ИмяОтбора - Ст
Фильтрация таблицы значений

С помощью построителя запросов

// ТаблицаОтборов - Таблица значений с колонками
// ИмяОтбора - Строка
// ВидСравнения - ВидСравнения
// Значение - Any
// Возвращает отфильтрованную таблицу значений

Функция ОтфильтроватьТаблицуЗначений(ТаблицаЗначенийДляФильтрации, ТаблицаОтборов)

 Построитель                = Новый ПостроительЗапроса;
 Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТаблицаЗначенийДляФильтрации);

 Для Каждого СтрокаКоллекции Из ТаблицаОтборов Цикл
  Отбор                     = Построитель.Отбор.Добавить(СтрокаКоллекции.ИмяОтбора);
  Отбор.ВидСравнения        = СтрокаКоллекции.ВидСравнения;
  Отбор.Использование       = Истина;
  Отбор.Значение            = СтрокаКоллекции.Значение;
 КонецЦикла;

 Возврат Построитель.Результат.Выгрузить();

КонецФункции
👉@DevLab1C

Индикатор прогресса в 1С (Прогресс-бар) В этом видео мы покажем, как легко и быстро реализовать индикатор прогресса (прогресс-бар) в 1С. Вы узнаете, как сделать интерфейс 1С более дружелюбным для пользователей, визуализировать выполнение длительных операций и избежать ощущения «зависшей» программы. источник 👉@DevLab1C