1С:Предприятие 8
781 subscribers
47 photos
160 videos
51 links
🔥 Разработка в 1С — просто и понятно! 🔥

Полезные фишки и лайфхаки для разработчиков
Объяснение сложных тем простыми словами
Готовые решения, сниппеты и примеры кода
Разбор ошибок и способов их устранения
Новости и тренды в мире 1С
Download Telegram
Как разрешить выбирать в поле на форме номенклатуру только типа «Комплект» (или другое условие)

Рассмотрим на примере документа «Изменение состава комплекта» из сертификационного экзамена 1С: Специалист по платформе. У него есть реквизит «Комплект» с типом «Номенклатура». Нужно сделать так чтобы в этом поле пользователь мог выбирать номенклатуру только с видом номенклатуры «Комплект».

Для этого нужно у этого реквизита в свойствах указать Параметры выбора Отбор.ВидНоменклатуры(Комплект):

Таким образом больше не нужно ничего писать в коде для гарантии того что пользователь сможет выбирать только комплекты.


👉@DevLab1C
Как быстро поменять название процедуры, назначенной на событие

Бывает так что имя процедуры слишком длинное или оно устарело. А чтобы его поменять – нужно изменить и название процедуры в коде и исправить её название в обработчике события.

Для быстрого изменения же следует делать это в поле с именем процедуры в событии. При изменении 1С предложит поменять имя процедуры:

И при нажатии «Да» имя процедуры изменится и в коде. Таким образом можно быстро выполнять рефакторинг.

👉@DevLab1C
👍1
Глюки платформы. Почему нельзя добавить команду «Перейти» к нужному регистру

Если на форме документа нельзя добавить команду "Перейти" - "Остатки номенклатуры" или любого другого регистра, то нужно открыть свойства нужного регистра и снять-поставить галку "Использовать стандартные команды". Это глюк платформы.

👉@DevLab1C
Отладка под определенным пользователем

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

👉@DevLab1C
👍2
Архивирование файлов средствами 1C (ZIP)

Код 1C v 8.х

ИмяZIPФайла = ПолучитьИмяВременногоФайла(".zip");

ФайлАрхива = Новый ЗаписьZipФайла(ИмяZIPФайла, , ,
МетодСжатияZIP.Сжатие,
УровеньСжатияZIP.Оптимальный);
ФайлАрхива.Добавить(ИмяВременногоФайла,
РежимСохраненияПутейZIP.СохранятьОтносительныеПути,
РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно);
ФайлАрхива.Записать();



👉@DevLab1C
Как быстро сохранить огромный отчет в EXCEL?

Иногда бывает так, что отчет очень большой (> 65535 строк), а работать с этим всем нужно через EXCEL - 1С такой отчет в xls не сохранит. Да и отчеты с меньшим количеством строк сохраняются в xls-файл очень долго.

Приведенная здесь небольшая хитрость поможет Вам сохранять для EXCEL таблицы с бОльшим количество строк и делать это быстрее.

Выведите отчет, идем в меню Файл-Сохранить копию и выбираем тип "Документ HTML4". Файл сохранится быстрее, чем в xls, и его корректно откроет EXCEL.
Потом можно в EXCEL пересохранить в xls или xlsx.

👉@DevLab1C
Media is too big
VIEW IN TELEGRAM
Универсальные коллекции значений 1С
Ильяс Низамутдинов

Урок №1. Массивы
Урок №2. Структура
Урок №3. Соответствие
Урок №4. Список значений
Урок №5. Таблица значений
Урок №6. Дерево значений
Урок №7.Бинарный поиск по таблице значений 1С

Все видео на youtube

👉@DevLab1C
👍2🔥1
Media is too big
VIEW IN TELEGRAM
Ускорение и оптимизация 1С. Базовый курс (2022)

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

Все видео на youtube

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


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

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

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

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

КонецФункции


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

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


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

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

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


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

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

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

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


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

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

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



👉@DevLab1C
🔥3👍1
Чтение и проверка прав и ролей пользователей в 1С 8.3


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

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

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

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

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

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

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


👉@DevLab1C
👍3🔥1
Сохранение, чтение и удаление настроек пользователя в 1С 8.3


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

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

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

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

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

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

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

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

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


👉@DevLab1C
👍3🔥2
Работа с 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
👍4🔥2
Работа с CSV. Выгрузка в файл CSV и его создание в 1С 8.3


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

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

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

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

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

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

КонецЕсли;

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

КонецЦикла;

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

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


👉@DevLab1C
👍4🔥2
Работа с CSV. Чтение файла CSV опционально (средствами 1С) в ТЗ в 1С 8.3


&НаСервере
Функция ПрочитатьCSVвТЗ(ИмяФайла, ИспользуемыйРазделитель=";", ЗаголовкиИзПервойСтроки = Ложь)

Текст = Новый ЧтениеТекста(ИмяФайла);
ТЗ = Новый ТаблицаЗначений;

// Создадим колонки
ТекСтрока = Текст.ПрочитатьСтроку();
Если ТекСтрока <> Неопределено Тогда
МассивCSV = СтрРазделить(ТекСтрока, ИспользуемыйРазделитель);
ИндексКолонки = 0;
Для Каждого ИмяКолонки Из МассивCSV Цикл
ИмяКолонки = ?(ЗаголовкиИзПервойСтроки, "Кол"+ИндексКолонки, ИмяКолонки);
ТЗ.Колонки.Добавить(ИмяКолонки);
ИндексКолонки = ИндексКолонки + 1;
КонецЦикла;
Если ЗаголовкиИзПервойСтроки Тогда
ТекСтрока = Текст.ПрочитатьСтроку();
КонецЕсли;
КонецЕсли;

Пока ТекСтрока <> Неопределено Цикл // строки читаются до символа перевода строки
НоваяСтрока = ТЗ.Добавить();

МассивCSV = СтрРазделить(ТекСтрока, ИспользуемыйРазделитель);
ИндексКолонки = 0;
Для Каждого СтрокаНом Из МассивCSV Цикл
НоваяСтрока[ИндексКолонки] = СтрокаНом;
ИндексКолонки = ИндексКолонки + 1;
КонецЦикла;

ТекСтрока = Текст.ПрочитатьСтроку();
КонецЦикла;

Возврат ТЗ;

КонецФункции


👉@DevLab1C
👍3
5 видео для подготовки к Аттестации 1С:Специалист-Консультант по производству и ремонтам в 1С:ERP 2.5

🔹Ключевые изменения в 1С:ERP 2.5.7 по производственному учету – за 15 минут
🔹За что получают двойки на Аттестации по производству и ремонтам в 1C:ERP 2.5?
🔹Как правильно реагировать на ошибки системы – на примере Аттестации Специалист-консультант по 1С:ERP
🔹Ремонт оборудования заказчика в 1С:ERP 2.5 – схема учета для Аттестации и проектов за 20 минут
🔹Объекты возникновения затрат (ОВЗ) в 1С:ERP 2.5.7 – разбираем новый функционал на практике

Все видео на youtube

👉@DevLab1C
👍2
Асинхронные функции.

Обещание и Возвращающие Обещание в 1С 8.3


Процедура ВыполнениеПримераСАсих()

Попытка
ВыполнениеКода();
Исключение
// Исключение из ВыполнениеКода() не будет перехвачено здесь
КонецПопытки

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

Асинх Функция ВыполнениеКода() // Всегда возвращает Обещание

ВызватьИсключение "Выброшено в ВыполнениеКода()";
//При успешном завершении в Обещание будет завернуто значение, которое было аргументом оператора Возврат.
//Если при выполнении Асинх функции произошло исключение, то в Обещание будет завернуто это исключение.

КонецФункции


Обещание как аргумент оператора Ждать в 1С 8.3


Асинх Процедура ВыполнениеПримераСАсих()

Попытка
// Для того, чтобы узнать как завершилась Асинх функция – это использовать возвращенное ею Обещание как аргумент оператора Ждать.
Ждать ВыполнениеКода(Null);
Исключение
// Исключение из НеNull() будет перехвачено здесь
Сообщить("Передали Null");
КонецПопытки

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

Асинх Функция ВыполнениеКода(ПеремП) // Всегда возвращает Обещание

Если ПеремП = Null Тогда
ВызватьИсключение "Выброшено в ВыполнениеКода()";
Иначе
Возврат ПеремП;
КонецЕсли;

КонецФункции

// Асинх процедура не возвращает значения. А если при выполнении Асинх процедуры возникнет не перехваченное исключение,
// то это приведет к выдаче сообщения об ошибке.


👉@DevLab1C
👍3🔥2
Работа с CSV. Чтение файла CSV через ADO (без схемы) в 1С 8.3


&НаСервере
Процедура ЧтениеФайлаCSV_ADO(); //Для работы с CSV файлами больших размеров (свыше 10Mb)

ФайлCSV="D:\import_11042025.csv";

ПутьСоединения = "Driver={Microsoft Text Driver (*.csv)};";
ПутьСоединения = ПутьСоединения + "Dbq=" + ФайлCSV + ";";
ПутьСоединения = ПутьСоединения + "Uid=" + "Extensions=csv" + ";";

ADOConn = Новый COMОбъект("ADODB.Connection");
ADOConn.ConnectionString = ПутьСоединения;
ADOConn.Open();

ADORec = Новый COMОбъект("ADODB.Recordset");
Попытка
ADORec.Open("S_elect * from file#txt", ADOConn);
Пока ADORec.EOF() = 0 Цикл

ADOСтрока="";
Для Счетчик = 0 По ADORec.Fields.Count-1 Цикл
ADOСтрока = ADOСтрока + ";" + ADORec.Fields(Счетчик).Value;
КонецЦикла;
//Сообщить("Прочитана строка: "+ADOСтрока);
ADORec.MoveNext();

КонецЦикла;
Исключение
ADORec.Close();
ADOConn.Close();

//Предупреждение("При чтении данных в CSV произошла ошибка:"+ОписаниеОшибки());
КонецПопытки;

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


👉@DevLab1C
👍2