diff --git a/.gitmodules b/.gitmodules index 7ad57665..25d1d8d5 100644 --- a/.gitmodules +++ b/.gitmodules @@ -758,3 +758,6 @@ url = https://github.com/austinwagner/sublime-sourcepawn [submodule "vendor/grammars/language-asn1"] path = vendor/grammars/language-asn1 url = https://github.com/ajLangley12/language-asn1 +[submodule "vendor/grammars/atom-language-1c-bsl"] + path = vendor/grammars/atom-language-1c-bsl + url = https://github.com/xDrivenDevelopment/atom-language-1c-bsl.git diff --git a/grammars.yml b/grammars.yml index 42a694df..e403dbfe 100755 --- a/grammars.yml +++ b/grammars.yml @@ -181,6 +181,9 @@ vendor/grammars/atom-fsharp/: - source.fsharp.fsi - source.fsharp.fsl - source.fsharp.fsx +vendor/grammars/atom-language-1c-bsl: +- source.bsl +- source.sdbl vendor/grammars/atom-language-clean: - source.clean vendor/grammars/atom-language-purescript/: diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 11f7ebc3..ccef7df0 100755 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -27,6 +27,15 @@ # # Please keep this list alphabetized. Capitalization comes before lower case. +1C Enterprise: + type: programming + color: "#814CCC" + extensions: + - .bsl + - .os + tm_scope: source.bsl + ace_mode: text + ABAP: type: programming color: "#E8274B" diff --git a/samples/1C Enterprise/Catalog.ИсходящиеПисьма.Form.ФормаЭлемента.Form.Module.bsl b/samples/1C Enterprise/Catalog.ИсходящиеПисьма.Form.ФормаЭлемента.Form.Module.bsl new file mode 100644 index 00000000..e59d89b9 --- /dev/null +++ b/samples/1C Enterprise/Catalog.ИсходящиеПисьма.Form.ФормаЭлемента.Form.Module.bsl @@ -0,0 +1,265 @@ +&НаСервереБезКонтекста +Функция ПолучитьКонтактноеЛицоПоЭлектроннойПочте(ЭлектроннаяПочта) + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ КонтактноеЛицо ИЗ Справочник.Контрагенты ГДЕ ЭлектроннаяПочта = &ЭлектроннаяПочта"; + Запрос.Параметры.Вставить("ЭлектроннаяПочта", СокрЛП(ЭлектроннаяПочта)); + Выборка = Запрос.Выполнить().Выбрать(); + КонтактноеЛицо = ""; + Если Выборка.Следующий() Тогда + КонтактноеЛицо = Выборка.КонтактноеЛицо; + КонецЕсли; + Возврат КонтактноеЛицо; +КонецФункции + +&НаСервереБезКонтекста +Функция ПолучитьКонтактноеЛицоПоПолучателю(Получатель) + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ КонтактноеЛицо ИЗ Справочник.Контрагенты ГДЕ Ссылка = &Получатель"; + Запрос.Параметры.Вставить("Получатель", Получатель); + Выборка = Запрос.Выполнить().Выбрать(); + КонтактноеЛицо = ""; + Если Выборка.Следующий() Тогда + КонтактноеЛицо = Выборка.КонтактноеЛицо; + КонецЕсли; + Возврат КонтактноеЛицо; +КонецФункции + +&НаСервереБезКонтекста +Процедура ДобавитьПолучателей(Получатель, Получатели) + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ ЭлектроннаяПочта ИЗ Справочник.Контрагенты ГДЕ Ссылка "; + Если ТипЗнч(Получатели) = Тип("Массив") Тогда + Запрос.Текст = Запрос.Текст + "В (&Получатели)"; + Иначе + Запрос.Текст = Запрос.Текст + "= &Получатели"; + КонецЕсли; + Запрос.Параметры.Вставить("Получатели", Получатели); + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + Если Получатель <> "" Тогда + Получатель = Получатель + "; "; + КонецЕсли; + Получатель = Получатель + Выборка.ЭлектроннаяПочта; + КонецЦикла; +КонецПроцедуры + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Если Параметры.Ключ.Пустая() Тогда + Заголовок = "Исходящее письмо (Создание)"; + Объект.Дата = ТекущаяДата(); + ПоШаблону = Параметры.Свойство("ПоШаблону"); + ВходящееПисьмо = Параметры.ВходящееПисьмо; + Если ПоШаблону = Истина Тогда + Элементы.ЗаполнитьПоШаблону.Видимость = Истина; + РаботаСПочтой.ЗаполнитьПисьмоПоШаблону(Объект, Содержимое); + ИначеЕсли Не ВходящееПисьмо.Пустая() Тогда + РаботаСПочтой.ЗаполнитьОтветНаПисьмо(ВходящееПисьмо, Объект, Содержимое); + КонецЕсли; + Адресаты = Параметры.Адресаты; + Если Адресаты <> Неопределено Тогда + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | Контрагенты.ЭлектроннаяПочта + |ИЗ + | Справочник.Контрагенты КАК Контрагенты + |ГДЕ + | Контрагенты.Ссылка В(&Адресаты) + | И Контрагенты.ЭлектроннаяПочта <> """""; + Запрос.УстановитьПараметр("Адресаты", Адресаты); + Получатель = ""; + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + Если Получатель <> "" Тогда + Получатель = Получатель + "; "; + КонецЕсли; + Получатель = Получатель + Выборка.ЭлектроннаяПочта; + КонецЦикла; + Объект.Получатель = Получатель; + КонецЕсли; + КонецЕсли; +КонецПроцедуры + +&НаСервере +Процедура ПриЧтенииНаСервере(ТекущийОбъект) + Содержимое = ТекущийОбъект.Содержимое.Получить(); + Заголовок = ТекущийОбъект.Наименование + " (Исходящее письмо)"; + Если РаботаСПочтой.ПисьмоОтправлено(ТекущийОбъект.Ссылка) Тогда + Заголовок = Заголовок + " - Отправлено"; + КонецЕсли; +КонецПроцедуры + +&НаСервере +Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) + ТекущийОбъект.Содержимое = Новый ХранилищеЗначения(Содержимое, Новый СжатиеДанных()); + ТекущийОбъект.Текст = Содержимое.ПолучитьТекст(); +КонецПроцедуры + +&НаСервере +Функция ОтправитьПисьмо(Ошибка) + Если Не Записать() Тогда + Ошибка = "ОшибкаЗаписи"; + Возврат Ложь; + КонецЕсли; + Если Не РаботаСПочтой.ОтправитьПисьмо(Объект.Ссылка) Тогда + Ошибка = "ОшибкаОтправки"; + Возврат Ложь; + КонецЕсли; + Заголовок = Заголовок + " - Отправлено"; + Возврат Истина; +КонецФункции + +&НаКлиенте +Функция ОтправитьПисьмоКлиент() + Ошибка = ""; + Если Не ОтправитьПисьмо(Ошибка) Тогда + Если Ошибка = "ОшибкаОтправки" Тогда + Кнопки = Новый СписокЗначений; + Кнопки.Добавить(1, "Настроить почту"); + Кнопки.Добавить(2, "Закрыть"); + + Оп = Новый ОписаниеОповещения( + "ОтправитьПисьмоКлиентВопросЗавершение", + ЭтотОбъект); + ПоказатьВопрос(Оп, + "Не указаны настройки интернет почты!", + Кнопки, , 1); + КонецЕсли; + Возврат Ложь; + КонецЕсли; + + НавигационнаяСсылка = ПолучитьНавигационнуюСсылку(Объект.Ссылка); + ПоказатьОповещениеПользователя("Письмо отправлено", НавигационнаяСсылка, Объект.Наименование); + ОповеститьОбИзменении(Объект.Ссылка); + Возврат Истина; +КонецФункции + +&НаКлиенте +Процедура ОтправитьПисьмоКлиентВопросЗавершение(Результат, Параметры) Экспорт + Если Результат = 1 Тогда + ОткрытьФорму("ОбщаяФорма.НастройкаПочты"); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура Отправить(Команда) + ОтправитьПисьмоКлиент(); +КонецПроцедуры + +&НаКлиенте +Процедура ОтправитьИЗакрыть(Команда) + Если Не ОтправитьПисьмоКлиент() Тогда + Возврат; + КонецЕсли; + Закрыть(); +КонецПроцедуры + +&НаКлиенте +Процедура ВставитьСтрокуВТекущуюПозицию(Поле, Документ, Строка) + Перем Начало, Конец; + Поле.ПолучитьГраницыВыделения(Начало, Конец); + Позиция = Документ.ПолучитьПозициюПоЗакладке(Начало); + Документ.Удалить(Начало, Конец); + Начало = Документ.ПолучитьЗакладкуПоПозиции(Позиция); + Документ.Вставить(Начало, Строка); + Позиция = Позиция + СтрДлина(Строка); + Закладка = Документ.ПолучитьЗакладкуПоПозиции(Позиция); + Поле.УстановитьГраницыВыделения(Закладка, Закладка); +КонецПроцедуры + +&НаКлиенте +Процедура ВставитьКонтактноеЛицо(Команда) + Если Объект.Контрагент.Пустая() Тогда + Сообщить("Выберите контрагента"); + Иначе + КонтактноеЛицо = ПолучитьКонтактноеЛицоПоПолучателю(Объект.Контрагент); + ВставитьСтрокуВТекущуюПозицию(Элементы.Содержимое, Содержимое, КонтактноеЛицо + " "); + КонецЕсли; +КонецПроцедуры + +&НаСервере +Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи) + Заголовок = ТекущийОбъект.Наименование + " (Исходящее письмо)"; +КонецПроцедуры + +&НаКлиенте +Процедура КонтрагентПриИзменении(Элемент) + ДобавитьПолучателей(Объект.Получатель, Объект.Контрагент); +КонецПроцедуры + +&НаКлиенте +Процедура ВыделитьВажное(Команда) + Перем Начало, Конец; + ВсеВажное = Истина; + Элементы.Содержимое.ПолучитьГраницыВыделения(Начало, Конец); + Если Начало = Конец Тогда + Возврат; + КонецЕсли; + + НаборТекстовыхЭлементов = Новый Массив(); + Для Каждого ТекстовыйЭлемент Из Содержимое.СформироватьЭлементы(Начало, Конец) Цикл + Если Тип(ТекстовыйЭлемент) = Тип("ТекстФорматированногоДокумента") Тогда + НаборТекстовыхЭлементов.Добавить(ТекстовыйЭлемент); + КонецЕсли; + КонецЦикла; + + Для Каждого ТекстовыйЭлемент Из НаборТекстовыхЭлементов Цикл + Если ТекстовыйЭлемент.Шрифт.Жирный <> Истина И + ТекстовыйЭлемент.ЦветТекста <> Новый Цвет(255, 0, 0) Тогда + ВсеВажное = Ложь; + Прервать; + КонецЕсли; + КонецЦикла; + + Для Каждого ТекстовыйЭлемент Из НаборТекстовыхЭлементов Цикл + ТекстовыйЭлемент.Шрифт = Новый Шрифт(ТекстовыйЭлемент.Шрифт, , , Не ВсеВажное); + ТекстовыйЭлемент.ЦветТекста = Новый Цвет(?(ВсеВажное, 0, 255), 0, 0); + КонецЦикла; +КонецПроцедуры + +&НаКлиенте +Процедура ЗаполнитьПоШаблону(Команда) + Если Объект.Контрагент.Пустая() Тогда + Сообщить("Выберите контрагента"); + Иначе + НайтиИЗаменить("[Контрагент]", Объект.Контрагент); + НайтиИЗаменить("[КонтактноеЛицо]", ПолучитьКонтактноеЛицоПоПолучателю(Объект.Контрагент)); + КонецЕсли; + НайтиИЗаменить("[ДатаПисьма]", Объект.Дата); +КонецПроцедуры + +&НаКлиенте +Процедура НайтиИЗаменить(СтрокаДляПоиска, СтрокаДляЗамены) + Перем ВставленныйТекст, ШрифтОформления, ЦветТекстаОформления, ЦветФонаОформления, НавигационнаяСсылкаОформления; + РезультатПоиска = Содержимое.НайтиТекст(СтрокаДляПоиска); + Пока ((РезультатПоиска <> Неопределено) И (РезультатПоиска.ЗакладкаНачала <> Неопределено) И (РезультатПоиска.ЗакладкаКонца <> Неопределено)) Цикл + ПозицияНачалаСледующегоЦиклаПоиска = Содержимое.ПолучитьПозициюПоЗакладке(РезультатПоиска.ЗакладкаНачала) + СтрДлина(СтрокаДляЗамены); + МассивЭлементовДляОформления = Содержимое.ПолучитьЭлементы(РезультатПоиска.ЗакладкаНачала, РезультатПоиска.ЗакладкаКонца); + Для Каждого ЭлементДляОформления Из МассивЭлементовДляОформления Цикл + Если Тип(ЭлементДляОформления) = Тип("ТекстФорматированногоДокумента") Тогда + ШрифтОформления = ЭлементДляОформления.Шрифт; + ЦветТекстаОформления = ЭлементДляОформления.ЦветТекста; + ЦветФонаОформления = ЭлементДляОформления.ЦветФона; + НавигационнаяСсылкаОформления = ЭлементДляОформления.НавигационнаяССылка; + Прервать; + КонецЕсли; + КонецЦикла; + Содержимое.Удалить(РезультатПоиска.ЗакладкаНачала, РезультатПоиска.ЗакладкаКонца); + ВставленныйТекст = Содержимое.Вставить(РезультатПоиска.ЗакладкаНачала, СтрокаДляЗамены); + Если ВставленныйТекст <> Неопределено И ШрифтОформления <> Неопределено Тогда + ВставленныйТекст.Шрифт = ШрифтОформления; + КонецЕсли; + Если ВставленныйТекст <> Неопределено И ЦветТекстаОформления <> Неопределено Тогда + ВставленныйТекст.ЦветТекста = ЦветТекстаОформления; + КонецЕсли; + Если ВставленныйТекст <> Неопределено И ЦветФонаОформления <> Неопределено Тогда + ВставленныйТекст.ЦветФона = ЦветФонаОформления; + КонецЕсли; + Если ВставленныйТекст <> Неопределено И НавигационнаяСсылкаОформления <> Неопределено Тогда + ВставленныйТекст.НавигационнаяССылка = НавигационнаяСсылкаОформления; + КонецЕсли; + + РезультатПоиска = Содержимое.НайтиТекст(СтрокаДляПоиска, Содержимое.ПолучитьЗакладкуПоПозиции(ПозицияНачалаСледующегоЦиклаПоиска)); + КонецЦикла; +КонецПроцедуры + diff --git a/samples/1C Enterprise/Catalog.Товары.Command.ПечатьПрайсЛиста.CommandModule.bsl b/samples/1C Enterprise/Catalog.Товары.Command.ПечатьПрайсЛиста.CommandModule.bsl new file mode 100644 index 00000000..f96e8811 --- /dev/null +++ b/samples/1C Enterprise/Catalog.Товары.Command.ПечатьПрайсЛиста.CommandModule.bsl @@ -0,0 +1,85 @@ +&НаСервере +Функция ПечатнаяФорма(ПараметрКоманды) + ТабличныйДокумент = Новый ТабличныйДокумент; + ТабличныйДокумент.ОтображатьСетку = Истина; + ТабличныйДокумент.ОтображатьЗаголовки = Истина; + + Сформирован = Ложь; + ТабМакет = Справочники.Товары.ПолучитьМакет("МакетПрайсЛиста"); + + Шапка = ТабМакет.ПолучитьОбласть("Шапка"); + ТабличныйДокумент.Вывести(Шапка); + + ОбластьНоменклатура = ТабМакет.ПолучитьОбласть("ОбластьНоменклатура"); + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | Товары.Код КАК Код, + | Товары.Наименование КАК Наименование, + | Товары.Артикул КАК Артикул, + | Товары.ФайлКартинки КАК Картинка, + | Товары.Описание КАК Описание, + | Товары.Вид КАК Вид, + | ЦеныТоваров.Цена КАК Цена + |ИЗ + | РегистрСведений.ЦеныТоваров КАК ЦеныТоваров + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Товары КАК Товары + | ПО ЦеныТоваров.Товар = Товары.Ссылка + |ГДЕ + | Товары.ЭтоГруппа = ЛОЖЬ + | И ЦеныТоваров.ВидЦен = &ВидЦен + | + |УПОРЯДОЧИТЬ ПО + | Вид, + | Товары.Родитель.Код, + | Код"; + + Запрос.УстановитьПараметр("ВидЦен", Справочники.ВидыЦен.НайтиПоНаименованию("Розничная")); + + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + ОбластьНоменклатура.Параметры.Заполнить(Выборка); + + Описание = ""; + + Чтение = Новый ЧтениеHTML(); + Чтение.УстановитьСтроку(Выборка.Описание); + + ДокDOM = Новый ПостроительDOM(); + HTML = ДокDOM.Прочитать(Чтение); + + Если Не HTML.ЭлементДокумента = Неопределено Тогда + Для Каждого Узел из HTML.ЭлементДокумента.ДочерниеУзлы Цикл + Если Узел.ИмяУзла = "body" Тогда + Для Каждого ЭлементОписания из Узел.ДочерниеУзлы Цикл + Описание = Описание + ЭлементОписания.ТекстовоеСодержимое; + КонецЦикла; + КонецЕсли; + КонецЦикла; + КонецЕсли; + ОбластьНоменклатура.Параметры.Описание = Описание; + + Если (Выборка.Картинка <> Null) Тогда + ОбластьНоменклатура.Параметры.ПараметрКартинки = Новый Картинка(Выборка.Картинка.ДанныеФайла.Получить()); + КонецЕсли; + + ТабличныйДокумент.Вывести(ОбластьНоменклатура, Выборка.Уровень()); + Сформирован = Истина; + КонецЦикла; + + Если Сформирован Тогда + Возврат ТабличныйДокумент; + Иначе + Возврат Неопределено; + КонецЕсли; +КонецФункции + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + ТабличныйДокумент = ПечатнаяФорма(ПараметрКоманды); + + Если ТабличныйДокумент <> Неопределено Тогда + ТабличныйДокумент.Показать(); + КонецЕсли; + +КонецПроцедуры diff --git a/samples/1C Enterprise/CommonModule.ОбменМобильныеОбщее.Module.bsl b/samples/1C Enterprise/CommonModule.ОбменМобильныеОбщее.Module.bsl new file mode 100644 index 00000000..d5a1a2cb --- /dev/null +++ b/samples/1C Enterprise/CommonModule.ОбменМобильныеОбщее.Module.bsl @@ -0,0 +1,109 @@ +// Процедура на основании анализа типа данных заменяет их на данные, удаляющие +// информацию из узла в котором их не должно быть +// +// Параметры: +// Данные – Объект, набор записей,... который нужно преобразовать +// +Процедура УдалениеДанных(Данные) + + // Получаем объект описания метаданного, соответствующий данным + ОбъектМетаданных = ?(ТипЗнч(Данные) = Тип("УдалениеОбъекта"), Данные.Ссылка.Метаданные(), Данные.Метаданные()); + // Проверяем тип, интересуют только те типы, которые реализованы на мобильной платформе + Если Метаданные.Справочники.Содержит(ОбъектМетаданных) + ИЛИ Метаданные.Документы.Содержит(ОбъектМетаданных) Тогда + + // Перенос удаления объекта для объектных + Данные = Новый УдалениеОбъекта(Данные.Ссылка); + + ИначеЕсли Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных) + ИЛИ Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных) + ИЛИ Метаданные.Последовательности.Содержит(ОбъектМетаданных) Тогда + + // Очищаем данные + Данные.Очистить(); + + КонецЕсли; + +КонецПроцедуры + +// Функция формирует пакет обмена, который будет отправлен узлу "УзелОбмена" +// +// Параметры: +// УзелОбмена – узел плана обмена "мобильные", с которым осуществляется обмен +// +// Возвращаемое значение: +// сформированный пакет, помещенный в хранилище значения +Функция СформироватьПакетОбмена(УзелОбмена) Экспорт + + ЗаписьXML = Новый ЗаписьXML; + + ЗаписьXML.УстановитьСтроку("UTF-8"); + ЗаписьXML.ЗаписатьОбъявлениеXML(); + + ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); + ЗаписьСообщения.НачатьЗапись(ЗаписьXML, УзелОбмена); + + ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance"); + ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("v8", "http://v8.1c.ru/data"); + + ТипДанныхУдаления = Тип("УдалениеОбъекта"); + + ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена, ЗаписьСообщения.НомерСообщения); + Пока ВыборкаИзменений.Следующий() Цикл + + Данные = ВыборкаИзменений.Получить(); + + // Если перенос данных не нужен, то, возможно, необходимо записать удаление данных + Если Не ОбменМобильныеПереопределяемый.НуженПереносДанных(Данные, УзелОбмена) Тогда + + // Получаем значение с возможным удалением данных + УдалениеДанных(Данные); + + КонецЕсли; + + // Записываем данные в сообщение + ОбменМобильныеПереопределяемый.ЗаписатьДанные(ЗаписьXML, Данные); + + КонецЦикла; + + ЗаписьСообщения.ЗакончитьЗапись(); + + Возврат Новый ХранилищеЗначения(ЗаписьXML.Закрыть(), Новый СжатиеДанных(9)); + +КонецФункции + +// Процедура вносит в информационную базу данные, которые присланы из узла "УзелОбмена" +// +// Параметры: +// УзелОбмена – узел плана обмена "мобильные", с которым осуществляется обмен +// ДанныеОбмена - пакет обмена полученный из узла УзелОбмена, помещен в ХранилищеЗначения +// +Процедура ПринятьПакетОбмена(УзелОбмена, ДанныеОбмена) Экспорт + + ЧтениеXML = Новый ЧтениеXML; + ЧтениеXML.УстановитьСтроку(ДанныеОбмена.Получить()); + ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения(); + ЧтениеСообщения.НачатьЧтение(ЧтениеXML); + ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель,ЧтениеСообщения.НомерПринятого); + + НачатьТранзакцию(); + Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл + + Данные = ОбменМобильныеПереопределяемый.ПрочитатьДанные(ЧтениеXML); + + Если Не Данные = Неопределено Тогда + + Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель; + Данные.ОбменДанными.Загрузка = Истина; + + Данные.Записать(); + + КонецЕсли; + + КонецЦикла; + ЗафиксироватьТранзакцию(); + + ЧтениеСообщения.ЗакончитьЧтение(); + ЧтениеXML.Закрыть(); + +КонецПроцедуры diff --git a/samples/1C Enterprise/Document.РасходТовара.ObjectModule.bsl b/samples/1C Enterprise/Document.РасходТовара.ObjectModule.bsl new file mode 100644 index 00000000..1edbfb08 --- /dev/null +++ b/samples/1C Enterprise/Document.РасходТовара.ObjectModule.bsl @@ -0,0 +1,302 @@ +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ +// + +// Формирование печатной формы документа +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// ТабличныйДокумент - Сформированный табличный документ. +Процедура ПечатнаяФорма(ТабличныйДокумент) Экспорт + + Макет = Документы.РасходТовара.ПолучитьМакет("МакетПечати"); + + // Заголовок + Область = Макет.ПолучитьОбласть("Заголовок"); + ТабличныйДокумент.Вывести(Область); + + // Шапка + Шапка = Макет.ПолучитьОбласть("Шапка"); + Шапка.Параметры.Заполнить(ЭтотОбъект); + ТабличныйДокумент.Вывести(Шапка); + + // Товары + Область = Макет.ПолучитьОбласть("ТоварыШапка"); + ТабличныйДокумент.Вывести(Область); + ОбластьТовары = Макет.ПолучитьОбласть("Товары"); + + Для каждого ТекСтрокаТовары Из Товары Цикл + + ОбластьТовары.Параметры.Заполнить(ТекСтрокаТовары); + ТабличныйДокумент.Вывести(ОбластьТовары); + + КонецЦикла; + +КонецПроцедуры + +// Формирование печатной формы документа +// +// Параметры: +// Нет. +// +// Возвращаемое значение: +// ТабличныйДокумент - Сформированный табличный документ. +Процедура Пересчитать() Экспорт + + Для каждого ТекСтрокаТовары Из Товары Цикл + + ТекСтрокаТовары.Сумма = ТекСтрокаТовары.Количество * ТекСтрокаТовары.Цена; + + КонецЦикла; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ОБЪЕКТА + +Процедура ОбработкаПроведения(Отказ, Режим) + + // Формирование движений регистров накопления ТоварныеЗапасы и Продажи. + Движения.ТоварныеЗапасы.Записывать = Истина; + Движения.Продажи.Записывать = Истина; + Если Режим = РежимПроведенияДокумента.Оперативный Тогда + Движения.ТоварныеЗапасы.БлокироватьДляИзменения = Истина; + КонецЕсли; + + // Создадим запрос, чтобы получать информацию об услугах + Запрос = Новый Запрос("ВЫБРАТЬ + | ТоварыВДокументе.НомерСтроки КАК НомерСтроки + |ИЗ + | Документ.РасходТовара.Товары КАК ТоварыВДокументе + |ГДЕ + | ТоварыВДокументе.Ссылка = &Ссылка + | И ТоварыВДокументе.Товар.Вид = ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Услуга)"); + + Запрос.УстановитьПараметр("Ссылка", Ссылка); + РезультатУслуги = Запрос.Выполнить().Выгрузить(); + РезультатУслуги.Индексы.Добавить("НомерСтроки"); + + Для каждого ТекСтрокаТовары Из Товары Цикл + + Строка = РезультатУслуги.Найти(ТекСтрокаТовары.НомерСтроки, "НомерСтроки"); + Если Строка = Неопределено Тогда + + // Не услуга + Движение = Движения.ТоварныеЗапасы.Добавить(); + Движение.ВидДвижения = ВидДвиженияНакопления.Расход; + Движение.Период = Дата; + Движение.Товар = ТекСтрокаТовары.Товар; + Движение.Склад = Склад; + Движение.Количество = ТекСтрокаТовары.Количество; + + КонецЕсли; + + Движение = Движения.Продажи.Добавить(); + Движение.Период = Дата; + Движение.Товар = ТекСтрокаТовары.Товар; + Движение.Покупатель = Покупатель; + Движение.Количество = ТекСтрокаТовары.Количество; + Движение.Сумма = ТекСтрокаТовары.Сумма; + + КонецЦикла; + + // Формирование движения регистра накопления Взаиморасчеты. + Движения.Взаиморасчеты.Записывать = Истина; + Движение = Движения.Взаиморасчеты.Добавить(); + Движение.ВидДвижения = ВидДвиженияНакопления.Расход; + Движение.Период = Дата; + Движение.Контрагент = Покупатель; + Движение.Валюта = Валюта; + + Если Валюта.Пустая() Тогда + Движение.Сумма = Товары.Итог("Сумма"); + Иначе + + Курс = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(Дата, Новый Структура("Валюта", Валюта)).Курс; + + Если Курс = 0 Тогда + Движение.Сумма = Товары.Итог("Сумма"); + Иначе + Движение.Сумма = Товары.Итог("Сумма") / Курс; + КонецЕсли; + + КонецЕсли; + + //Запишем движения + Движения.Записать(); + + //Контроль остатков при оперативном проведении + Если Режим = РежимПроведенияДокумента.Оперативный Тогда + // Создадим запрос, чтобы контролировать остатки по товарам + Запрос = Новый Запрос("ВЫБРАТЬ + | ТоварыВДокументе.Товар КАК Товар, + | СУММА(ТоварыВДокументе.Количество) КАК Количество, + | МАКСИМУМ(ТоварыВДокументе.НомерСтроки) КАК НомерСтроки + | + |ПОМЕСТИТЬ ТребуетсяТовара + | + |ИЗ + | Документ.РасходТовара.Товары КАК ТоварыВДокументе + | + |ГДЕ + | ТоварыВДокументе.Ссылка = &Ссылка + | И ТоварыВДокументе.Товар.Вид = ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Товар) + | + |СГРУППИРОВАТЬ ПО + | ТоварыВДокументе.Товар + | + |ИНДЕКСИРОВАТЬ ПО + | Товар + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ПРЕДСТАВЛЕНИЕ(ТребуетсяТовара.Товар) КАК ТоварПредставление, + | ВЫБОР + | КОГДА - ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0) > ТоварыВДокументе.Количество + | ТОГДА ТоварыВДокументе.Количество + | ИНАЧЕ - ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0) + | КОНЕЦ КАК Нехватка, + | ТоварыВДокументе.Количество - ВЫБОР + | КОГДА - ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0) > ТоварыВДокументе.Количество + | ТОГДА ТоварыВДокументе.Количество + | ИНАЧЕ - ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0) + | КОНЕЦ КАК МаксимальноеКоличество, + | ТребуетсяТовара.НомерСтроки КАК НомерСтроки + | + |ИЗ + | ТребуетсяТовара КАК ТребуетсяТовара + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварныеЗапасы.Остатки( + | , + | Товар В + | (ВЫБРАТЬ + | ТребуетсяТовара.Товар + | ИЗ + | ТребуетсяТовара) + | И Склад = &Склад) КАК ТоварныеЗапасыОстатки + | ПО ТребуетсяТовара.Товар = ТоварныеЗапасыОстатки.Товар + | ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходТовара.Товары КАК ТоварыВДокументе + | ПО ТребуетсяТовара.Товар = ТоварыВДокументе.Товар + | И ТребуетсяТовара.НомерСтроки = ТоварыВДокументе.НомерСтроки + | + |ГДЕ + | ТоварыВДокументе.Ссылка = &Ссылка И + | 0 > ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0) + | + |УПОРЯДОЧИТЬ ПО + | НомерСтроки"); + + Запрос.УстановитьПараметр("Склад", Склад); + Запрос.УстановитьПараметр("Ссылка", Ссылка); + РезультатСНехваткой = Запрос.Выполнить(); + + ВыборкаРезультатаСНехваткой = РезультатСНехваткой.Выбрать(); + + // Выдадим ошибки для строк, в которых не хватает остатка + Пока ВыборкаРезультатаСНехваткой.Следующий() Цикл + + Сообщение = Новый СообщениеПользователю(); + Сообщение.Текст = НСтр("ru = 'Не хватает '", "ru") + + ВыборкаРезультатаСНехваткой.Нехватка + + НСтр("ru = ' единиц товара'", "ru") + """" + + ВыборкаРезультатаСНехваткой.ТоварПредставление + + """" + + НСтр("ru = ' на складе'", "ru") + + """" + + Склад + + """." + + НСтр("ru = 'Максимальное количество: '", "ru") + + ВыборкаРезультатаСНехваткой.МаксимальноеКоличество + + "."; + Сообщение.Поле = НСтр("ru = 'Товары'", "ru") + + "[" + + (ВыборкаРезультатаСНехваткой.НомерСтроки - 1) + + "]." + + НСтр("ru = 'Количество'", "ru"); + Сообщение.УстановитьДанные(ЭтотОбъект); + Сообщение.Сообщить(); + Отказ = Истина; + + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры + +Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) + // Проверим заполненность поля "Покупатель" + Если Покупатель.Пустая() Тогда + + // Если поле Покупатель не заполнено, сообщим об этом пользователю + Сообщение = Новый СообщениеПользователю(); + Сообщение.Текст = НСтр("ru = 'Не указан Покупатель, для которого выписывается накладная!'", "ru"); + Сообщение.Поле = НСтр("ru = 'Покупатель'", "ru"); + Сообщение.УстановитьДанные(ЭтотОбъект); + + Сообщение.Сообщить(); + + // Сообщим платформе, что мы сами обработали проверку заполнения поля "Покупатель" + ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти("Покупатель")); + // Так как информация в документе не консистентна, то продолжать работу дальше смысла нет + Отказ = Истина; + + КонецЕсли; + + //Если склад не заполнен, то проверим есть ли в документе что-то кроме услуг + Если Склад.Пустая() И Товары.Количество() > 0 Тогда + + // Создадим запрос, чтобы получать информацию об товарах + Запрос = Новый Запрос("ВЫБРАТЬ + | Количество(*) КАК Количество + |ИЗ + | Справочник.Товары КАК Товары + |ГДЕ + | Товары.Ссылка В (&ТоварыВДокументе) + | И Товары.Вид = ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Товар)"); + + Запрос.УстановитьПараметр("ТоварыВДокументе", Товары.ВыгрузитьКолонку("Товар")); + Выборка = Запрос.Выполнить().Выбрать(); + Выборка.Следующий(); + Если Выборка.Количество = 0 Тогда + // Сообщим платформе, что мы сами обработали проверку заполнения поля "Склад" + ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти("Склад")); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) + + Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Контрагенты") Тогда + + ЗапросПоКонтрагенту = Новый Запрос("ВЫБРАТЬ + | Контрагенты.ЭтоГруппа, + | Контрагенты.ВидЦен + |ИЗ + | Справочник.Контрагенты КАК Контрагенты + |ГДЕ + | Контрагенты.Ссылка = &КонтрагентСсылка"); + ЗапросПоКонтрагенту.УстановитьПараметр("КонтрагентСсылка", ДанныеЗаполнения); + Выборка = ЗапросПоКонтрагенту.Выполнить().Выбрать(); + Если Выборка.Следующий() И Выборка.ЭтоГруппа Тогда + Возврат; + КонецЕсли; + + ВидЦен = Выборка.ВидЦен; + Покупатель = ДанныеЗаполнения.Ссылка; + + ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда + + Значение = Неопределено; + + Если ДанныеЗаполнения.Свойство("Покупатель", Значение) Тогда + ВидЦен = Значение.ВидЦен; + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + diff --git a/samples/1C Enterprise/ci_before_script.os b/samples/1C Enterprise/ci_before_script.os new file mode 100644 index 00000000..baeaa475 --- /dev/null +++ b/samples/1C Enterprise/ci_before_script.os @@ -0,0 +1,20 @@ +Каталог = ОбъединитьПути(ТекущийКаталог(), "libs\oscript-library\src"); +Загрузчик_Оригинал_ИмяФайла = ОбъединитьПути(Каталог, "package-loader.os"); + +Файлы = НайтиФайлы(Каталог, , Ложь); +Для Каждого ВыбФайл Из Файлы Цикл + + Если ВыбФайл.ЭтоФайл() Тогда + Продолжить; + КонецЕсли; + + Загрузчик_ИмяФайла = ОбъединитьПути(ВыбФайл.ПолноеИмя, "package-loader.os"); + Загрузчик_Файл = Новый Файл(Загрузчик_ИмяФайла); + + Если Загрузчик_Файл.Существует() Тогда + Продолжить; + КонецЕсли; + + КопироватьФайл(Загрузчик_Оригинал_ИмяФайла, Загрузчик_ИмяФайла); + +КонецЦикла; \ No newline at end of file diff --git a/samples/1C Enterprise/test_canCompile.os b/samples/1C Enterprise/test_canCompile.os new file mode 100644 index 00000000..2e949785 --- /dev/null +++ b/samples/1C Enterprise/test_canCompile.os @@ -0,0 +1,42 @@ +#Использовать "../libs/oscript-library/src/v8runner" +#Использовать "../libs/oscript-library/src/tempfiles" + +Перем Лог; +Перем КодВозврата; + +Процедура Инициализация() + + Лог = Логирование.ПолучитьЛог("oscript.app.gitlab-test_CanCompile"); + КодВозврата = 0; + +КонецПроцедуры + +Процедура ВыполнитьТест() + + Конфигуратор = Новый УправлениеКонфигуратором(); + + ПараметрыЗапуска = Конфигуратор.ПолучитьПараметрыЗапуска(); + КомандаЗапуска = "/LoadConfigFromFiles ""%1"""; + КомандаЗапуска = СтрШаблон(КомандаЗапуска, ТекущийКаталог() + "\source\cf"); + + Лог.Информация("Команда обновления конфигурации: " + КомандаЗапуска); + + ПараметрыЗапуска.Добавить(КомандаЗапуска); + + Попытка + Конфигуратор.ВыполнитьКоманду(ПараметрыЗапуска); + Исключение + + Лог.Ошибка(Конфигуратор.ВыводКоманды()); + КодВозврата = 1; + + КонецПопытки; + + УдалитьФайлы(Конфигуратор.ПутьКВременнойБазе()); + +КонецПроцедуры + +Инициализация(); +ВыполнитьТест(); + +ЗавершитьРаботу(КодВозврата); \ No newline at end of file diff --git a/vendor/grammars/atom-language-1c-bsl b/vendor/grammars/atom-language-1c-bsl new file mode 160000 index 00000000..787ea4fd --- /dev/null +++ b/vendor/grammars/atom-language-1c-bsl @@ -0,0 +1 @@ +Subproject commit 787ea4fd3ac7239325ca35341fb74b01284125dd diff --git a/vendor/licenses/grammar/atom-language-1c-bsl.txt b/vendor/licenses/grammar/atom-language-1c-bsl.txt new file mode 100644 index 00000000..b1f0d78c --- /dev/null +++ b/vendor/licenses/grammar/atom-language-1c-bsl.txt @@ -0,0 +1,25 @@ +--- +type: grammar +name: atom-language-1c-bsl +license: mit +--- +Copyright © 2015 xDrivenDevelopment + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.