Все о программировании в 1С, шаблоны кода, полезные инструменты и сервисы, стандарты разработки и паттерны
1.98K subscribers
15 photos
2 videos
5 files
78 links
Все о программировании в 1С, шаблоны кода, полезные инструменты и сервисы, стандарты разработки и паттерны
Обратная связь, публикации: @usefultools1c_bot
Download Telegram
Хранилище общих настроек

В этом хранилище можно хранить любые данные. Подробнее можно почитать здесь.
Рассмотрим пример хранения произвольных данных.

Сохранение данных:

&НаСервере
Процедура ПередЗакрытиемНаСервере()

// Подготовим структуру хранения данных
СтруктураНастроек = Новый Структура;
СтруктураНастроек.Вставить("Всем", Всем);
СтруктураНастроек.Вставить("Близким", Близким);
СтруктураНастроек.Вставить("Друзьям", Друзьям);
// Сохраним данные в хранилище общих настроек
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(
"Учеб_СделатьВсёХорошо",
"Настройки",
СтруктураНастроек);

КонецПроцедуры
Восстановление данных:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

// Инициализируем структуру
СтруктураНастроек = Новый Структура;
// Восстановим сохраненные данные
СтруктураНастроек = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(
"Учеб_СделатьВсёХорошо",
"Настройки",
СтруктураНастроек);
// Заполним значения реквизитов формы
ЗаполнитьЗначенияСвойств(ЭтаФорма, СтруктураНастроек);

КонецПроцедуры
👍1
Как из формы документа открыть форму списка данного документа, спозиционировавшись на нем же?

ФормаСписка = Документы[Метаданные().Имя].ПолучитьФормуСписка();
ФормаСписка.ПараметрТекущаяСтрока = Ссылка;
ФормаСписка.Открыть();

ФормаСписка = Документы[Метаданные().Имя].ПолучитьФормуСписка( , , Новый УникальныйИдентификатор());
👍4
ОбщегоНазначенияБТС.Пауза(КоличествоСекунд); //сделать паузу во время выполнения кода
Если есть чем полезным поделиться с коллегами - отправляйте, пожалуйста, в бот @usefultools1c_bot
Как реализовать метод "красного сторно" для регистра бухгалтерии?
https://github.com/Shadawn/A1-Export
https://infostart.ru/public/1270967/
Экспортная библиотека для систем 1С
Библиотека со многими функциями, которые могут значительно облегчить жизнь программисту 1С. Подключается как расширение (версии 8.3.12 и старше). Совместимо с любыми конфигурациями.

Предупреждение
Несмотря на то, что библиотека используется в продуктивных базах, её не стоит рассматривать как законченное продуктивное решение, готовое к эксплуатации в HighLoad-системах. Библиотека активно разрабатывается. Обратная совместимость предполагается согласно Semantic Versioning (внутри основной версии/первой цифры отсутствуют изменения, теряющие обратную совместимость). Документация библиотеки на данном этапе оставляет желать лучшего.

Некоторые возможности библиотеки основаны на механизмах БСП. Например, при попытке получения значения дополнительного сведения в конфигурации, не имеющей регистра "Дополнительные сведения", Вы получите исключение. Можно просто не использовать соответствующие функции.

Возможности
Значительное количество функций для работы с примитивными типами, распределенные по индивидуальным модулям.
Функции для удобной работы с дополнительными реквизитами.
Функции для работы с Ворд и Эксель.
Функции для работы с СКД.
Функции для удобного программного создания реквизитов и элементов форм.
И многое другое.
Файлы созданы с использованием стандартной выгрузки в xml системы 1С. Соответственно, каталог можно обратно собрать обратно в расширение с помощью конфигуратора. Альтернативно, можно использовать файл extension.cfe - это уже собранное расширение.
👍2
API ДЛЯ СКЛОНЕНИЙ В ТЕКСТОВЫХ СООБЩЕНИЯХ

Все мы знаем, что наша программа тем приятнее пользователю, чем дружественнее интерфейс и грамотнее построение сообщений для пользователя.
В канале уже был пост про правила составления сообщений, сегодня хочется остановиться на его последнем пункте, который был упомянут лишь вскользь. Если быть точнее, то на одном из таких моментов:
Использование исчисляемых существительных.

Часто можно встретить что-то подобное:
Срок истекает через 1 дней.

В БСП, в общем модуле СтроковыеФункцииКлиентСервер, есть архиполезная функция ЧислоЦифрамиПредметИсчисленияПрописью(), которая помогает в таких ситуациях.
В параметры передаётся число и варианты прописи исчисляемого существительного в виде строки, где через запятую прописаны варианты для одной, двух и пяти единиц.
Для примера выше код выглядел бы так:

ШаблонСообщения = "Срок истекает через %1";
Исчисляемое = СтроковыеФункцииКлиентСервер.ЧислоЦифрамиПредметИсчисленияПрописью(ЧислоДней, "день,дня,дней");
ТекстСообщения = СтрШаблон(ШаблонСообщения, Исчисляемое);

Есть у функции и третий параметр – возможность убрать из результата число, оставив только правильно склонённое существительное. Это может быть удобно, когда нужно обработать эти часть отдельно, например, вывести их разными шрифтами.

#юзабилити
Асинхронные функции.

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

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

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

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

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

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

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



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

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

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

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

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

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

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

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



✍️ @odin1C_rus
👍4
КАК ВЫПОЛНИТЬ ПРОЦЕДУРУ В ОТЛАДКЕ?

Не баян, а классика.

Находясь в отладчике, мы можем вызывать функции (в т.ч. при помощи "Вычислить выражение").
Это бывает нужно для тестирования и выявления каких-то проблем. Например, сделать что-то с данными формы в закрытых полях и так далее.

Но вызывать можно только функции, ведь только они возвращают результат. А иногда необходимо выполнить процедуру. Например, метод общего модуля, который что-то сделает с нашими данными. Ну или даже просто удалить элемент из переменной массива. Такое сделать без "костылей", к сожалению, нельзя.

Как же можно вызвать процедуру в отладке?
Для этого нам нужна функция. Самый простой пример:
Функция Вып(Код, Параметр = Неопределено) Экспорт
Выполнить Код;
КонецФункции

Функция может быть сложнее и удобнее в использовании. Главное, чтобы она вызывала метод платформы Выполнить(НашКод)

🤔 ГДЕ РАЗМЕСТИТЬ ВСПОМОГАТЕЛЬНУЮ ФУНКЦИЮ?

1️⃣ В своём инструменте
Да, самое очевидное - добавить метод там, где мы его будем использовать. В нашей обработке, например. Но такая функция будет доступна только внутри нашего инструмента. Не очень удобно

2️⃣ Общий модуль
Другой напрашивающийся способ - найти (или добавить) где-то в общем модуле. Это может потребовать доработки конфигурации или же установки расширения.

2️⃣ Внешняя обработка
Если бы всегда нам подходили первые два способа, то было бы не так интересно.
Но если мы по какой-то причине не хотим ставить расширение для таких целей, то можно пойти другим путём. Создать внешнюю обработку с таким же методом. Метод придётся разместить в модуле самой обработки и дополнительно в форме. Тогда он будет доступен и на сервере и на клиенте.

🤔 КАК ИСПОЛЬЗОВАТЬ ТАКУЮ ОБРАБОТКУ
Сначала нужно её открыть в режиме предприятия. Так мы "подключим" её к сеансу. А далее уже в коде можем создавать её объекты. Давайте выведем таким образом сообщение:

Для выполнения НаКлиенте можно делать так:
ПолучитьФорму("ВнешняяОбработка.Вып.Форма").Вып("Сообщить(Параметр)", "Текст");

А НаСервере так:
ВнешниеОбработки.Создать("Вып").Вып("Сообщить(Параметр)", "Текст")

Если же мы ведем отладку в фоновом задании, то открытие обработки в режиме предприятия нам не поможет. Но можно использовать и другой вызов:
ВнешниеОбработки.Создать("МойПутьКФайлу", Ложь).Вып("Сообщить(Параметр)", "Текст")

Главное в таком случае разместить обработку в доступном для сервера каталоге. Правда и тут может произойти проблема, если установлена "Защита от опасных действий". Тогда нужно при создании обработки передать ещё третий параметр - ОписаниеЗащитыОтОпасныхДействий. Для его создания обычно в типовых есть метод ОбщегоНазначения.ОписаниеЗащитыБезПредупреждений()

ВнешниеОбработки.Создать("МойПутьКФайлу", Ложь, ОбщегоНазначения.ОписаниеЗащитыБезПредупреждений()).Вып("Сообщить(
Параметр
)", "Текст")

Да, выглядит костыльно, но иногда бывает полезно. Но вообще, если вам нужно просто в какой-то открытой форме изменить значение реквизита, видимость элемента и т.п., то легче вообще не открывать отладчик, а использовать специальные инструменты в режиме предприятия. Например, Менеджер открытых форм 1С.

_______________
@JuniorOneS
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🤔2