Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
17 фев 2026, 22:21

Как создать Gitlab

Автор mamix, Сегодня в 19:55

0 Пользователей и 1 гость просматривают эту тему.

mamix

Гитлаб - Зарегестрироваться - New project - Create blank project
Навзание - modification_UNF, Project URL - своя учет. запись


Конфигурция - Расширения конфигурации
Добавить: Основное, пр_
Галка только на активно.

Конфигурация - Хранилище конфигурации - Создать
хранилище.

Создать папку Storage1C
Указать её в создании хранилища
2 раза далее
admin 123
ок

Конфигурация - Хранилище конфигурации - Администрирование хранилища
Добавить ivanov 123
Права - Изменение состава версий

Основное ПКМ - захватить в хранилище - ок
Добавить ТестовыйСправочник - Поместить в хранилище - Коментарий: создан тестовый справочник "пр_ТестовыйСправочник" - ок

ПКМ Тестовый справочник - Захватить в хранилище - Переименовать - ПКМ Поместить в хранилище - Коментарий "переименован тестовый справочник"

mamix

В vs code скачать markdown - нажать Ctrl + K, V
Папка how_to_connect - how_to_connect.md - скрины с названием img1, img2



Как подключиться к Хранилищу и не потерять текущие изменения:
1.Нажмите «Конфигурация» -> «Расширения конфигурации».
2.Откроется окно с расширениями, выберите свое расширение.
3.Нажмите правой кнопкой мыши на своем расширении и выберите пункт меню
«Конфигурация» -> «Сохранить конфигурацию в файл».
4.Выберите место для сохранения и нажмите кнопку «Сохранить».
5.Нажмите правой кнопкой мыши на корень расширения конфигурации выберите
пункт меню «Хранилище конфигурации» -> «Подключиться к хранилищу».
6. В окне с предупреждением о замене конфигурации из хранилища нажмите
кнопку «Да».
7. В окне «Подключение к хранилищу расширения Основное» укажите путь где
находиться Ваше хранилище, напишите Имя пользователя и пароль из хранилища.
После чего нажмите «Ок».
8. В окне об успешном подключении к хранилищу нажмите кнопку «Ок»
 
Как получить изменения из хранилища:
Нажмите пункт меню "Конфигурация" —> "Хранилище конфигурации" —>
«Обновить конфигурацию из хранилища». После чего данные из хранилища
обновятся.

Как добавить новый объект:
1. Нажмите правой кнопкой мыши на корень расширения конфигурации, и
выберите пункт меню «Захватить в хранилище».
2. Нажмите правой кнопкой мыши на объект «Справочники», и выберите пункт
меню «Добавить».
3. В результате создастся справочник, который можно менять на свое усмотрение.


Как отправить изменения в хранилище:
1. Нажмите правой кнопкой мыши на тот объект, который необходимо поместить в
хранилище, и выберите пункт меню «Поместить в хранилище».
2. Откроется окно с предупреждением о необходимости сохранения. Нажмите
кнопку «Да».
3. В окне «Помещение объектов в хранилище расширения конфигурации
Основное» можно добавить комментарий перед помещением объекта в хранилище,
после чего нажмите кнопку «Ок».
Выгрузите информационную базу и нажмите пункт меню «Конфигурация»
меню «Хранилище конфигурации» команду «Отключиться от хранилища».

mamix

Новая информационноя база - Загрузить каркасную инф базу
Расширение основное

Справочник Проекты - добавить реквизит "пр_КалендарьСотрудника" - тип данных СправочникСсылка.КалендариСотрудников
Добавить тот же код, но заменить серое на "пр_КалендарьСотрудника".


Конфигурация - Перечисления - ПризнакиАгента - Значение "Платежный агент" - ПКМ - Добавить в расширение

Создать обработку "пр_ЗагрузкаСпискаЗадач", добавить в подсистему "Работы"
Создать форму обработки
На вкладке "Реквизиты" добавить реквизит "ПросмотрДанных" и указать тип "ТаблицаЗначений".
Добавить колонки по списку Excel: Клиент, Проект, НазваниеЗадачи, ТекстЗадачи, Статус, Дата, Номер, Исполнитель - Строка
Оценка, ФактическоеВремя - Число, Неотрицательное: Истина
НетКлиента, НетПроекта, НетИсполнителя, - Булево
Отдельный реквизит - ТекстСообщенияОНеНайденныхДанных

ПросмотрДанных - перенести на вкладку элементы - Таблица - Ок
НетКлиента, НетПроекта, НетИсполнителя - Видимость снять флажок
ТекстСообщенияОНеНайденныхДанных - перенести на вкладку элементы - Свойства: ТолькоПросмотр, МногострочныйРежим ДА, АвтоМаксимальнаяШирина Ложь.

Вкладка Команды - создать ПросмотретьДанные, ЗагрузитьДанные - перенести в Командную панель
ФормаЗагрузитьДанные - Доступность снять флаг

Форма - УсловноеОформление открыть: Цвет фона - ПросмотрДанных.НетКлиента Равно "Истина" - ПросмотрДанныхКлиент, с другими так же.

ПросмотрДанных - ПоложениеКоманднойПанели - Нет.


ВСТАВИТЬ КОД В МОДУЛЬ:

&НаКлиенте
Асинх Процедура ПросмотретьДанные(Команда)

   ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
   ПараметрыДиалога.Заголовок = "Выберите файл для загрузки списка задач";
   ПараметрыДиалога.Фильтр = "Табличный документ *.xlsx | *.xlsx";
   ПараметрыДиалога.МножественныйВыбор = Ложь;
   
   ОписаниеФайла = Ждать ПоместитьФайлНаСерверАсинх(,,,ПараметрыДиалога);
   
   Если ОписаниеФайла <> Неопределено Тогда
      ПрочитатьExcelНаСервере(ОписаниеФайла.Адрес, ОписаниеФайла.СсылкаНаФайл.Расширение);
   КонецЕсли;
   
   
КонецПроцедуры

&НаСервере
Процедура ПрочитатьExcelНаСервере(АдресДанных, РасширениеФайла)

    ПутьКФайлу = ПолучитьИмяВременногоФайла(РасширениеФайла);
    Данные = ПолучитьИзВременногоХранилища(АдресДанных);
    Данные.Записать(ПутьКФайлу);
    ПрочитатьExcel_ПостроительЗапроса(ПутьКФайлу);
    УдалитьФайлы(ПутьКФайлу);
    ПросмотретьДанныеНаОшибки();

 КонецПроцедуры
 
 
 &НаСервере
 Процедура ПрочитатьExcel_ПостроительЗапроса(ПутьКФайлу)
 
      ПросмотрДанных.Очистить();
     ТабДок = Новый ТабличныйДокумент;
    
     Попытка
        ТабДок.Прочитать(ПутьКФайлу);
     Исключение
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Не удалось прочитать файл по причине: "+ОписаниеОшибки();
        Сообщение.Сообщить();
        Возврат;
     КонецПопытки;
    
     Построитель = Новый ПостроительЗапроса;
     Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область());
     Построитель.ЗаполнитьНастройки();
     Построитель.Выполнить();
     ТаблицаИзExcel = Построитель.Результат.Выгрузить();
     ЭтотОбъект.ПросмотрДанных.Загрузить(ТаблицаИзExcel);
 
 КонецПроцедуры
 

 &НаСервере
 Процедура ПросмотретьДанныеНаОшибки()
   
    ЕстьОщибка = Ложь;
   
    ТекстНеНайденныхДанных = Новый Массив;
    ТекстНеНайденныхДанных.Добавить("Информация о не найденных данных:");
    ТекстСообщенияОНеНайденныхДанных = "Все данные могут быть загружены";
   
    Для НомерСтроки = 0 По ПросмотрДанных.Количество()-1 Цикл
       НовыйКлиент = Справочники.Контрагенты.НайтиПоНаименованию(ПросмотрДанных[НомерСтроки].Клиент);
      
       Если НовыйКлиент = Неопределено Или НовыйКлиент.Пустая() Тогда
          ПросмотрДанных[НомерСтроки].НетКлиента = Истина;
       КонецЕсли;
      
      
       НовыйПроект = Справочники.Проекты.НайтиПоНаименованию(ПросмотрДанных[НомерСтроки].Проект);
      
       Если НовыйПроект = Неопределено Или НовыйПроект.Пустая() Тогда
          ПросмотрДанных[НомерСтроки].НетПроекта = Истина;
       КонецЕсли;
      
      
       НовыйИсполнитель = Справочники.Сотрудники.НайтиПоНаименованию(ПросмотрДанных[НомерСтроки].Исполнитель);
      
       Если НовыйИсполнитель = Неопределено Или НовыйИсполнитель.Пустая() Тогда
          ПросмотрДанных[НомерСтроки].НетИсполнителя = Истина;
       КонецЕсли;
      
      
       Если ПросмотрДанных[НомерСтроки].НетИсполнителя = Истина
          Или ПросмотрДанных[НомерСтроки].НетПроекта = Истина
          Или ПросмотрДанных[НомерСтроки].НетКлиента = Истина Тогда
         
          ТекстНеНайденныхДанных.Добавить("В строке №" + Строка(НомерСтроки+1)+ ", не найдены следующие данные: ");
         
          Если ПросмотрДанных[НомерСтроки].НетИсполнителя = Истина Тогда
             ТекстНеНайденныхДанных.Добавить("Исполниетель(Сотрудник): " + Строка(ПросмотрДанных[НомерСтроки].Исполнитель));
             ПоказатьПолеСНеНайденнымиДанными("сотруднику", НомерСтроки, "Исполнитель");
             ЕстьОшибка = Истина;
          КонецЕсли;
         
          Если ПросмотрДанных[НомерСтроки].Нетпроекта = Истина Тогда
             ТекстНеНайденныхДанных.Добавить(", Проект: " + Строка(ПросмотрДанных[НомерСтроки].Проект));
             ПоказатьПолеСНеНайденнымиДанными("проекту", НомерСтроки, "Проект");
          КонецЕсли;
         
          Если ПросмотрДанных[НомерСтроки].НетКлиента = Истина Тогда
             ТекстНеНайденныхДанных.Добавить(", Клиент: " + Строка(ПросмотрДанных[НомерСтроки].Клиент));
             ПоказатьПолеСНеНайденнымиДанными("клиенту", НомерСтроки, "Клиент");
          КонецЕсли;
       КонецЕсли;
    КонецЦикла;
   
    Если ТекстНеНайденныхДанных[0] = "Информация о не найденных данных:" Тогда
       ТекстСообщенияОНеНайденныхДанных = СтрСоединить(ТекстНеНайденныхДанных, " ");
    КонецЕсли;
   
    Если ЕстьОшибка = Истина Тогда
       Элементы.ФормаЗагрузитьДанные.Доступность = Ложь;
    Иначе
       Элементы.ФормаЗагрузитьДанные.Доступность = Истина;
    КонецЕсли;
   
 КонецПроцедуры
 
 
 &НаСервере
 Процедура ПоказатьПолеСНеНайденнымиДанными(НазваниеНеНайденныхДанных, НомерСтроки, НазваниеКолонки)
 
    Сообщение = Новый СообщениеПользователю;
   Сообщение.Текст = "Не найдены связанные данные по " + НазваниеНеНайденныхДанных;
   Сообщение.Поле = "ПросмотрДанных[" + XMLСтрока(НомерСтроки) + "]." + НазваниеКолонки;
   Сообщение.Сообщить();
 
 КонецПроцедуры


&НаСервере
 Процедура ЗагрузитьДанныеНаСервере()
    ДанныеДляЗагрузки = ПодготовитьОбщиеДанные();
    Если Не ДанныеДляЗагрузки.ОбщиеДанныеПодготовлены Тогда
       Возврат;
    КонецЕсли;
   
    Для Каждого ТекущаяСтрока Из ЭтотОбъект.ПросмотрДанных Цикл
       Попытка
          ОбработатьСтрокуДанных(ТекущаяСтрока, ДанныеДляЗагрузки);
       Исключение
          ОбработатьОшибку(ТекущаяСтрока, ОписаниеОшибки());
       КонецПопытки;
      
    КонецЦикла;
    Сообщить("Данные загружены");
   
 КонецПроцедуры


&НаКлиенте
 Процедура ЗагрузитьДанные(Команда)
    ЗагрузитьДанныеНаСервере();
 КонецПроцедуры
 
 
 &НаСервере
 Функция ПодготовитьОбщиеДанные()
 
       Данные = Новый Структура;
      Данные.Вставить("СостояниеЗапланировано", Справочники.СостоянияСобытий.НайтиПоНаименованию("Запланировано"));
      Если Данные.СостояниеЗапланировано.Пустая() Тогда
         Сообщить("Не найдено состояние 'Запланировано'", СтатусСообщения.Важное);
         Данные.Вставить("ОбщиеДанныеПодготовлены", Ложь);
         Возврат Данные;
      КонецЕсли;
      
      Данные.Вставить("Организация", Справочники.Организации.НайтиПоНаименованию("Ассоль ООО"));
      Если Данные.Организация.Пустая() Тогда
         Сообщить("Не найдена организация 'Ассоль ООО'", СтатусСообщения.Важное);
         Данные.Вставить("ОбщиеДанныеПодготовлены", Ложь);
         Возврат Данные;
      КонецЕсли;
      
      
      Данные.Вставить("СтруктурнаяЕдиница", Справочники.СтруктурныеЕдиницы.НайтиПоНаименованию("Администрация"));
      Если Данные.СтруктурнаяЕдиница.Пустая() Тогда
         Сообщить("Не найдена структурная единица 'Администрация'", СтатусСообщения.Важное);
         Данные.Вставить("ОбщиеДанныеПодготовлены", Ложь);
         Возврат Данные;
      КонецЕсли;
      
      Данные.Вставить("ВидЦен", Справочники.ВидыЦен.НайтиПоНаименованию("Розничная"));
      Данные.Вставить("ВидОперации", Перечисления.ВидыОперацийЗаданиеНаРаботу.Внешнее);
      Данные.Вставить("КэшСотрудников", Новый Соответствие);
      Данные.Вставить("КэшКонтрагентов", Новый Соответствие);
      Данные.Вставить("КэшПроектов", Новый Соответствие);
      Данные.Вставить("КэшКалендарей", Новый Соответствие);
      Данные.Вставить("КэшКолонокКалендарей", Новый Соответствие);
      Данные.Вставить("КэшЗаданийНаРаботу", Новый Соответствие);
      Данные.Вставить("ОбщиеДанныеПодготовлены", Истина);
      Возврат Данные;
      
 КонецФункции
 

 &НаСервере
 Процедура ОбработатьСтрокуДанных(ТекущаяСтрока, Данные)
   
    ЗаданиеНаРаботу = СоздатьИлиПолучитьЗаданиеНаРаботу(ТекущаяСтрока, Данные.КэшЗаданийНаРаботу);
    Если ЗаданиеНаРаботу = Неопределено Тогда
       ВызватьИсключение "Не удалось создать или получить задание на работу";
    КонецЕсли;
   
    Сотрудник = ПолучитьИлиСоздатьСотрудника(ТекущаяСтрока.Исполнитель, Данные.КэшСотрудников);
    Если Сотрудник = Неопределено Тогда
       ВызватьИсключение "Не удалось создать или получить сотрудника";
    КонецЕсли;
   
    Контрагент = ПолучитьИлиСоздатьКонтрагента(ТекущаяСтрока.Клиент, Данные.КэшКонтрагентов);
    Если Контрагент = Неопределено Тогда
       ВызватьИсключение "Не удалось создать или получить контрагента";
    КонецЕсли;
   
    Проект = ПолучитьИлиСоздатьПроект(ТекущаяСтрока.Проект, Контрагент , Данные);
    Если Проект = Неопределено Тогда
       ВызватьИсключение "Не удалось создать или получить проект";
    КонецЕсли;
   
    Календарь = ПолучитьИлиСоздатьКалендарь(ТекущаяСтрока.Проект, Данные);
    Если Календарь = Неопределено Тогда
       ВызватьИсключение "Не удалось создать или получить календарь";
    КонецЕсли;
   
    ЗаполнитьИСохранитьВсеОбъекты(ЗаданиеНаРаботу, ТекущаяСтрока, Сотрудник, Проект, Календарь, Данные);
   
 КонецПроцедуры

 
 &НаСервере
 Функция СоздатьИлиПолучитьЗаданиеНаРаботу(ТекущаяСтрока, КэшЗаданийНаРаботу)
   
    Если КэшЗаданийНаРаботу[ТекущаяСтрока.Номер] <> Неопределено Тогда
       Возврат КэшЗаданийНаРаботу[ТекущаяСтрока.Номер];
    КонецЕСли;
   
    ТекущееЗаданиеНаРаботу = Документы.ЗаданиеНаРаботу.НайтиПоНомеру(ТекущаяСтрока.Номер,
    СтрЗаменить(Лев(ТекущаяСтрока.Дата, 10), "-", ""));
   
    Если ТекущееЗаданиеНаРаботу.Пустая() Или ТекущееЗаданиеНаРаботу = Неопределено Тогда
       НовыйДокумент = Документы.ЗаданиеНаРаботу.СоздатьДокумент();
       КэшЗаданийНаРаботу[ТекущаяСтрока.Номер] = НовыйДокумент;
       Возврат НовыйДокумент;
    Иначе
       СуществующийДокумент = ТекущееЗаданиеНаРаботу.ПолучитьОбъект();
       КэшЗаданийНаРаботу[ТекущаяСтрока.Номер] = СуществующийДокумент;
       Возврат СуществующийДокумент;
    КонецЕсли;
    
 КонецФункции
 
 
  &НаСервере
 Функция ПолучитьИлиСоздатьКонтрагента(НаименованиеКонтрагента, КэшКонтаргента)
   
    Если КэшКонтаргента[НаименованиеКонтрагента] <> Неопределено Тогда
       Возврат КэшКонтаргента[НаименованиеКонтрагента];
    КонецЕСли;
   
    Контаргент = Справочники.Контрагенты.НайтиПоНаименованию(НаименованиеКонтрагента);
   
    Если Контаргент.Пустая() Или Контаргент = Неопределено Тогда
      Контаргент = Справочники.Контрагенты.СоздатьЭлемент();
      Контаргент.Наименование = НаименованиеКонтрагента;
      Контаргент.НаименованиеПолное = НаименованиеКонтрагента;
      Контаргент.Покупатель = Истина;
      Контаргент.Записать();
   КонецЕсли;
   
    КэшКонтаргента[НаименованиеКонтрагента] = Контаргент;
    Возврат Контаргент;
    
 КонецФункции 
 
 
  &НаСервере
 Функция ПолучитьИлиСоздатьСотрудника(НаименованиеСотрудника, КэшСотрудников)
   
    Если КэшСотрудников[НаименованиеСотрудника] <> Неопределено Тогда
       Возврат КэшСотрудников[НаименованиеСотрудника];
    КонецЕСли;
   
    Сотрудник = Справочники.Сотрудники.НайтиПоНаименованию(НаименованиеСотрудника);
   
    Если Сотрудник.Пустая() Или Сотрудник = Неопределено Тогда
      Сотрудник = Справочники.Сотрудники.СоздатьЭлемент();
      Сотрудник.Наименование = НаименованиеСотрудника;
      Сотрудник.Записать();
   КонецЕсли;
   
    КэшСотрудников[НаименованиеСотрудника] = Сотрудник;
    Возврат Сотрудник;
    
 КонецФункции   
 
 
 
 &НаСервере
 функция ПолучитьИлиСоздатьПроект(НаименованиеПроекта, Контрагент, Данные)
   
    Если Данные.КэшПроектов[НаименованиеПроекта] <> Неопределено Тогда
       Возврат Данные.КэшПроектов[НаименованиеПроекта];
    КонецЕсли;
   
    Проект = Справочники.Проекты.НайтиПоНаименованию(НаименованиеПроекта);
    Если Проект.Пустая() Или Проект = Неопределено Тогда
       Проект = Справочники.Проекты.СоздатьЭлемент();
        Проект.Наименование = НаименованиеПроекта;
        Проект.Контрагент = Контрагент.Ссылка;
      
       Договор = СоздатьИлиПолучитьДоговорКонтрагента(Контрагент, Данные);
       Если Договор <> Неопределено Тогда
          Проект.Договор = Договор.Ссылка;
       КонецЕсли;
      
       Календарь = ПолучитьИлиСоздатьКалендарь(Проект, Данные);
       Если Календарь <> Неопределено Тогда
          Проект.пр_КалендарьСотрудника = Календарь.Ссылка;
       КонецЕсли;
      
       Проект.Записать();
    Иначе
       Проект = Проект.ПолучитьОбъект();
    КонецЕсли;
   
    Данные.КэшПроектов[НаименованиеПроекта] = Проект;
    Возврат Проект;
 КонецФункции
 
   
&НаСервере
Функция СоздатьИлиПолучитьДоговорКонтрагента(Контрагент, Данные)

        //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
   // Данный фрагмент построен конструктором.
   // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
   
   Запрос = Новый Запрос;
   Запрос.Текст =
      "ВЫБРАТЬ ПЕРВЫЕ 1
      |   ДоговорыКонтрагентов.Ссылка КАК Ссылка
      |ИЗ
      |   Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
      |ГДЕ
      |   ДоговорыКонтрагентов.Владелец = &Владелец";
   
   Запрос.УстановитьПараметр("Владелец", Контрагент.Ссылка);
   
   РезультатЗапроса = Запрос.Выполнить();
   
   Выборка = РезультатЗапроса.Выбрать();
   
   Если Выборка.Следующий() Тогда
      Возврат Выборка.Ссылка.ПолучитьОбъект();
   КонецЕсли;
   
   Договор = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
   Договор.Владелец = Контрагент.Ссылка;
   Договор.Наименование = "Основной договор";
   Договор.ВидДоговора = Перечисления.ВидыДоговоров.СПокупателем;
   Договор.Организация = Данные.Организация;
   Если Данные.ВидЦен <> Неопределено Тогда
      Договор.ВидЦен = Данные.ВидЦен;
   КонецЕсли;
   
   Договор.СпособВыставленияДокументов = Перечисления.СпособыВыставленияДокументов.ЭлектроннаяПочта;
   Договор.ПризнакАгента = Перечисления.ПризнакиАгента.ПлатежныйАгент;
   Договор.Записать();
   Возврат Договор;
   
КонецФункции

      
&НаСервере
Функция ПолучитьИлиСоздатьКалендарь(НаименованиеПроекта, Данные)
   НаименованиеКалендаря = "Календарь проекта """ + НаименованиеПроекта + """";
   
   Если Данные.КэшКалендарей[НаименованиеКалендаря] <> Неопределено Тогда
      Возврат Данные.КэшКалендарей[НаименованиеКалендаря];
   КонецЕсли;
   
     Календарь = Справочники.КалендариСотрудников.НайтиПоНаименованию(НаименованиеКалендаря);
    Если Календарь.Пустая() Или Календарь =  Неопределено Тогда
       Календарь = Справочники.КалендариСотрудников.СоздатьЭлемент();
       Календарь.Наименование = НаименованиеКалендаря;
       Календарь.ВладелецКалендаря = Справочники.Сотрудники.НайтиПоНаименованию(
       ПользователиИнформационнойБазы.ТекущийПользователь().ПолноеИмя).Ссылка;
       Календарь.Записать();
    КонецЕсли;
   
    Данные.КэшКалендарей[НаименованиеКалендаря] = Календарь;
    Возврат Календарь;
   

 КонецФункции // ПолучитьИлиСоздатьКалендарь()
 
 &НаСервере
 Процедура ЗаполнитьИСохранитьВсеОбъекты(ЗаданиеНаРаботу, ТекущаяСтрока, Сотрудник, Проект, Календарь, Данные)
    НачатьТранзакцию();
    Попытка
       ЗаполнитьДокументЗаданиеНаРаботу(ЗаданиеНаРаботу, ТекущаяСтрока, Сотрудник, Проект, Календарь, Данные);
       ЗаданиеНаРаботу.Записать(РежимЗаписиДокумента.Проведение);
       ЗаписьКалендаря = СоздатьИлиОбновитьЗаписьКалендаря(ЗаданиеНаРаботу, ТекущаяСтрока, Календарь, Данные);
       ЗаписьКалендаря.Записать();
       ЗафиксироватьТранзакцию();
    Исключение
       ОтменитьТранзакцию();
       ВызватьИсключение;
    КонецПопытки;
   
 КонецПроцедуры
 
 
&НаСервере
Процедура ЗаполнитьДокументЗаданиеНаРаботу(ЗаданиеНаРаботу, ТекущаяСтрока, Сотрудник, Проект, Календарь, Данные)

   ЗаданиеНаРаботу.Сотрудник = Сотрудник.Ссылка;
   ЗаданиеНаРаботу.пр_фактGitlab = ТекущаяСтрока.ФактическоеВремя;
    ЗаданиеНаРаботу.пр_ПланGitlab = ТекущаяСтрока.Оценка;
   ЗаданиеНаРаботу.Дата = Дата(Лев(ТекущаяСтрока.Дата,4),Сред(ТекущаяСтрока.Дата,6,2),Сред(ТекущаяСтрока.Дата,9,2));
   
   Если ЗаданиеНаРаботу.ЭтоНовый() Тогда
      ЗаданиеНаРаботу.Номер = ТекущаяСтрока.Номер;
   КонецЕсли;
   ЗаданиеНаРаботу.ВидОперации = Данные.ВидОперации;
   ЗаданиеНаРаботу.Состояние = Данные.СостояниеЗапланировано;
   ЗаданиеНаРаботу.Автор = Справочники.Пользователи.НайтиПоНаименованию(
   ПользователиИнформационнойБазы.ТекущийПользователь().ПолноеИмя);
   ЗаданиеНаРаботу.пр_Проект = Проект.Ссылка;
   ЗаданиеНаРаботу.КалендарьСотрудника = Календарь.Ссылка;
   ЗаданиеНаРаботу.СтруктурнаяЕдиница = Данные.СтруктурнаяЕдиница;
   ЗаданиеНаРаботу.Организация = Данные.Организация;
   
   Если ЗаданиеНаРаботу.Работы.Количество() = 0 Тогда
      НоваяЗаписьРаботы = ЗаданиеНаРаботу.Работы.Добавить();
      НоваяЗаписьРаботы.ДатаНачала = Дата(Лев(ТекущаяСтрока.Дата,4),Сред(ТекущаяСтрока.Дата,6,2),Сред(ТекущаяСтрока.Дата,9,2));
      НоваяЗаписьРаботы.ДатаОкончания = ТекущаяДата();
      НоваяЗаписьРаботы.Комментарий = "Название задачи: " + ТекущаяСтрока.НазваниеЗадачи
      + Символы.ПС + Символы.ПС + "Текст задачи:" + Символы.ПС + Символы.ПС + ТекущаяСтрока.ТекстЗадачи;
   КонецЕсли;
   
      
КонецПроцедуры

   
&НаСервере
Функция СоздатьИлиОбновитьЗаписьКалендаря(ЗаданиеНаРаботу, ТекущаяСтрока, Календарь, Данные)

       //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
   // Данный фрагмент построен конструктором.
   // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
   
   Запрос = Новый Запрос;
   Запрос.Текст =
      "ВЫБРАТЬ ПЕРВЫЕ 1
      |   ЗаписиКалендаряСотрудника.Ссылка КАК СсылкаЗаписьКалендаряСотрудника
      |ИЗ
      |   Справочник.ЗаписиКалендаряСотрудника КАК ЗаписиКалендаряСотрудника
      |ГДЕ
      |   ЗаписиКалендаряСотрудника.Источник = &Источник";
   
   Запрос.УстановитьПараметр("Источник", ЗаданиеНаРаботу.Ссылка);
   
   РезультатЗапроса = Запрос.Выполнить();
   
   Выборка = РезультатЗапроса.Выбрать();
   
   Если Выборка.Следующий() Тогда
      ЗаписьКалендаря = Выборка.СсылкаЗаписьКалендаряСотрудника.ПолучитьОбъект();
   Иначе
      ЗаписьКалендаря = Справочники.ЗаписиКалендаряСотрудника.СоздатьЭлемент();
      ЗаписьКалендаря.Источник = ЗаданиеНаРаботу.Ссылка;
   КонецЕсли;
   КолонкаКалендаря = ПолучитьИлиСоздатьКолонкуКалендаря(ТекущаяСтрока.Статус, Календарь, Данные);
   Если КолонкаКалендаря <> Неопределено Тогда
      ЗаписьКалендаря.КолонкаКалендаря = КолонкаКалендаря;
   КонецЕсли;
   Возврат ЗАписьКалендаря;
КонецФункции // СоздатьИлиОбновитьЗаписьКалендаря()


&НаСервере
Функция ПолучитьИлиСоздатьКолонкуКалендаря(Статус, Календарь, Данные)
    КлючКэша = Строка(Календарь.Ссылка.УникальныйИдентификатор()) + Статус;
   Если Данные.КэшКолонокКалендарей[КлючКэша] <> Неопределено Тогда
      Возврат Данные.КэшКолонокКалендарей[КлючКэша];
   КонецЕсли;
   
       //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
   // Данный фрагмент построен конструктором.
   // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
   
   Запрос = Новый Запрос;
   Запрос.Текст =
      "ВЫБРАТЬ ПЕРВЫЕ 1
      |   КолонкиКалендарейСотрудников.Ссылка КАК Ссылка
      |ИЗ
      |   Справочник.КолонкиКалендарейСотрудников КАК КолонкиКалендарейСотрудников
      |ГДЕ
      |   КолонкиКалендарейСотрудников.Владелец = &Владелец
      |   И КолонкиКалендарейСотрудников.Наименование = &Наименование";
   
   Запрос.УстановитьПараметр("Владелец", Календарь.Ссылка);
   Запрос.УстановитьПараметр("Наименование", Статус);
   
   Результат = Запрос.Выполнить();
   Выборка = Результат.Выбрать();
   
   Если Выборка.Следующий() Тогда
      Колонка = Выборка.Ссылка;
   Иначе
      Колонка = Справочники.КолонкиКалендарейСотрудников.СоздатьЭлемент();
      Колонка.Наименование = Статус;
      Колонка.Владелец = Календарь.Ссылка;
      Колонка.Записать();
   КонецЕсли;
   
   Данные.КэшКолонокКалендарей[КлючКэша] = Колонка;
   Возврат Колонка;
   
КонецФункции // ПолучитьИлиСоздатьКолонкуКалендаря()


&НаСервере
Процедура ОбработатьОшибку(ТекущаяСтрока, ТекстОшибки)

    Сообщение = "Ошибка при обработке строки с номером '" + ТекущаяСтрока.Номер + "': " + ТекстОшибки;
    Сообщить(Сообщение, СтатусСообщения.Важное);
    ЗаписьЖурналаРегистрации("ЗагрузкаДанных", УровеньЖурналаРегистрации.Ошибка, ,, Сообщение);

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



ВЫБРАТЬ ДЕЙСТВИЯ ДЛЯ КОМАНД: ПросмотретьДанные, ЗагрузитьДанные.

Если после нажатия "Просмотреть данные" показало, что нет клиентов то добавить их вручную.
Нажать "Загрузить данные"

mamix

Название работы: Описание архитектуры решения: Расчет финансового
результата.
Раздел 1: Поиск алгоритма и ключевые объекты
1.1. Ключевой объект метаданных
Вопрос: Какой объект метаданных (документ, справочник, обработка и т.д.) в
конечном итоге выполняет расчет и формирует движения в регистрах при расчете
финансового результата?
[ОТВЕТ]:
Тип объекта: Документ
Имя объекта: ЗакрытиеМесяца
1.2. Основные методы
Вопрос: Какие процедуры/функции отвечают за необходимый алгоритм?
[ОТВЕТ]:
Процедура РассчитатьФинансовыйРезультат
Функция
СформироватьТаблицуБазыРаспределенияФинансовогоРезультата
Раздел 2: Общее описание алгоритма
2.1. Назначение процедуры
Вопрос: Теперь, когда вы нашли основную процедуру, опишите в 1-2
предложениях: какую главную бизнес-задачу она решает?
[ОТВЕТ]:
Главная бизнес-задача процедуры — выполнить закрытие счетов доходов
и расходов за отчетный период. Алгоритм рассчитывает итоговый финансовый
результат (прибыль или убыток), перенося обороты с временных счетов (90, 91
и т.д.) на счет учета прибыли и убытков (99).
2.2. Основные этапы
Вопрос: На какие два больших логических этапа можно разделить основную
процедуру?
[ОТВЕТ]:
Этап 1: Прямое отнесение. На этом этапе обрабатываются доходы и
расходы, которые можно однозначно и напрямую отнести на финансовый
результат конкретного направления деятельности без дополнительных расчетов.
Этап 2: Распределение косвенных расходов. На этом этапе
обрабатываются расходы (как правило, общехозяйственные), которые нельзя
отнести напрямую. Они распределяются пропорционально между различными
аналитиками (направлениями деятельности, проектами и т.д.) согласно
заданным правилам.
Раздел 3: Работа с данными (Регистры)
3.1. Источники данных (Чтение)
Вопрос: Перечислите, из каких регистров алгоритм читает информацию для
проведения расчетов.
[ОТВЕТ]:
- РегистрНакопления.ДоходыИРасходы – основной источник данных, из
него читаются обороты по всем доходам и расходам, подлежащим закрытию.
- РегистрНакопления.Продажи – используется для получения данных
(выручка, себестоимость, количество) при расчете базы для распределения
косвенных расходов.
3.2. Результаты (Запись)
Вопрос: Перечислите, в какие регистры алгоритм записывает результаты своей
работы.
[ОТВЕТ]:
- РегистрыНакопления.ФинансовыйРезультат – сюда записываются
итоговые суммы доходов и расходов в разрезе аналитик для последующего
анализа и построения отчетов.
- РегистрыБухгалтерии.Управленческий – в этот регистр записываются
непосредственно бухгалтерские проводки, которые формируют финансовый
результат на счетах управленческого учета.
Раздел 4: Детальный анализ алгоритма
4.1. Какие управленческие проводки (Дт/Кт) формируются?
Вопрос: Проанализируйте блок кода, обрабатывающий данные. Какие
управленческие проводки (Дт/Кт) формируются?
[ОТВЕТ]:
Алгоритм формирует два типа стандартных закрывающих проводок:
- Для доходов: Дт [Счет учета доходов] Кт [Счет учета
прибыли/убытков]
- Для расходов: Дт [Счет учета прибыли/убытков] Кт [Счет учета
расходов]
4.2. Какие есть главные ветки выполнения
Вопрос: Проанализируйте какие есть главные ветки выполнения (их 2), чем они
отличаются, почему нужны 2 ветки.
[ОТВЕТ]:
Алгоритм содержит две ключевые ветки (этапа), которые обрабатывают
разные типы доходов и расходов:
1) Первая ветка (прямое отнесение):
- Чем отличается: Она отбирает записи, у которых в счете учета указан
способ распределения "Не распределять", либо счет учета напрямую
соответствует счету выручки/себестоимости из настроек направления
деятельности.
- Почему нужна: Эта ветка нужна для быстрой и простой обработки тех
сумм, которые уже содержат всю необходимую аналитику. Например, выручка
от продажи конкретного товара по конкретному заказу — ее можно сразу
отнести на финансовый результат этого направления/заказа.
2) Вторая ветка (распределение):
- Чем отличается: Она отбирает записи, у которых способ
распределения НЕ равен "Не распределять". Это косвенные расходы, такие как
аренда офиса, зарплата администрации и т.п., которые относятся ко всей
деятельности компании.
- Почему нужна: Эта ветка необходима, так как косвенные расходы
нельзя отнести на какое-то одно направление. Их нужно справедливо
"размазать" по всем направлениям, которые приносили доход. Для этого
рассчитывается специальная "база распределения" (например, выручка или
валовая прибыль), и расход делится пропорционально этой базе. Без этого
механизма невозможно было бы корректно рассчитать рентабельность каждого
направления деятельности.

mamix

Зайти в профиль GitLab - Edit profile - Access tokens
Нажать Add new token - Имя любое, дата истечения тот же день следующего года, установить все галочки - Create token.
Сохранить куда-нибудь токен.
Перейти в Projects - открыть необходимый репозиторий, нажать на кнопку "Code" и скопировать путь репозитория из поля "Clone with HTTPS".

Создать на диске папку ReposGitLab.
В командной строке написать: cd C:\ReposGitLab
Написать git clone + путь репозитория для клонирования.

Открыть приложение SourceTree и создать новую вкладку
Нажать + и выбрать "Внешний"
Нажать "Добваить учётную запись"

Хостинг: GitLab
Протокол: HTTPS
Аунтефикация: Personal Access Token
Нажать "Обновить Personal Access Token"

В открывшемся окне ввести имя пользователя из GitLab и токен доступа.
Нажмите на кнопку "ОК".
Перейдите в режим добавления репозитория, выберите путь к клонированному
репозиторию выше и нажмите кнопку "Добавить".

Открыть папку ReposGitLab и там создать новую папку с именем "Session 1"
В папке "Session 1" создайте папку "src"

Расширения конфигурации - выбрать Основное - Конфигурация - Сохранить конфигурацию в файл
Сохранить расширение в папке "Session 1", указав имя расширения session 1.cfe

Расширения конфигурации - выбрать Основное - Конфигурация - Выгрузить конфигурацию в файлы
Сохранить конфигурацию расширения в папку "src" - нажать выгрузить - да

Скопировать в папку "Session 1" все созданные файлы за время сессии: добавить how_to_connect

Открыть SourceTree - слева нажать "Состояния файлов" - нажать "Индексировать всё"
Добавить комментарий: "Добавлены результаты сессии 1" к коммиту - нажать "Закоммитить"

На панели нажать "Отправить" далее тоже Отправить


В Gitlab открыть проект modification_UNF
Перейти в раздел Issues
Нажмать на кнопку "New Item"
Поле Title заполнить: "Алгоритм расчета финансового результата при Закрытии месяца"
В поле Description вставить ответ задачи 1.5(АнализМеханизмаОбъяснения в дипсик)
Нажать Create Issue

mamix

В расширение "Основное" в документ "ЗаданиеНаРаботу" добавить два реквизита с типом дата: пр_ДатаНачалаРазработки, пр_ДатаНачалаАнализа.

В ДОКУМЕНТ ЗаданиеНаРаботу ВСТАВИТЬ КОД:
&НаСервере
Процедура пр_ТекущаяКолонкаЗадания()
   
   Запрос = Новый Запрос;
   Запрос.Текст =
   "ВЫБРАТЬ
   |   ЗаписиКалендаряСотрудника.КолонкаКалендаря КАК КолонкаКалендаря
   |ИЗ
   |   Справочник.ЗаписиКалендаряСотрудника КАК ЗаписиКалендаряСотрудника
   |ГДЕ
   |   ЗаписиКалендаряСотрудника.Источник = &Источник";
   
   Запрос.УстановитьПараметр("Источник", Объект.Ссылка);
   
   РезультатЗапроса = Запрос.Выполнить();
   
   ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
   
   Если ВыборкаДетальныеЗаписи.Следующий() Тогда
      
      КолонкаКалендаря = ВыборкаДетальныеЗаписи.КолонкаКалендаря;
      УстановитьДатыНачалаСтатусов(КолонкаКалендаря);
   Иначе
      
      КолонкаКалендаря = Справочники.КолонкиКалендарейСотрудников.ПустаяСсылка();
      
   КонецЕсли;
   
КонецПроцедуры

&НаКлиенте
Процедура пр_ПослеЗаписиПосле(ПараметрыЗаписи)
   
   пр_ТекущаяКолонкаЗадания();
   
КонецПроцедуры

&НаКлиенте
Процедура пр_ОбработкаОповещенияПосле(ИмяСобытия, Параметр, Источник)
   
   Если ИмяСобытия = "ЗаданиеПеремещено" Тогда
      пр_ТекущаяКолонкаЗадания();
   КонецЕсли;
   
КонецПроцедуры



&НаСервере
Процедура УстановитьДатыНачалаСтатусов(КолонкаКалендаря)
   Если Строка(КолонкаКалендаря) = "Анализ" и Не ЗначениеЗаполнено(Объект.пр_ДатаНачалаАнализа) Тогда
      Объект.пр_ДатаНачалаАнализа = ТекущаяДата();
   КонецЕсли;
   
   Если Строка(КолонкаКалендаря) = "В работе" и Не ЗначениеЗаполнено(Объект.пр_ДатаНачалаРазработки) Тогда
      Объект.пр_ДатаНачалаРазработки = ТекущаяДата();
   КонецЕсли;
   
   
   
КонецПроцедуры


&НаКлиенте
Процедура пр_ИзмененииПроекта(Элемент)

    пр_ИзмененииПроектаНаСервере();

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

&НаСервере
Процедура пр_ИзмененииПроектаНаСервере()

   Объект.КалендарьСотрудника = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.пр_Проект, "пр_КалендарьСотрудника");

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

&НаСервере
Функция ПолучитьПроектТекущегоКалендаря()

      //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
   // Данный фрагмент построен конструктором.
   // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
   
   Запрос = Новый Запрос;
   Запрос.Текст =
      "ВЫБРАТЬ
      |   Проекты.Ссылка КАК Ссылка
      |ИЗ
      |   Справочник.Проекты КАК Проекты
      |ГДЕ
      |   Проекты.пр_КалендарьСотрудника = &пр_КалендарьСотрудника";
   
   Запрос.УстановитьПараметр("пр_КалендарьСотрудника", Объект.КалендарьСотрудника);
   
   РезультатЗапроса = Запрос.Выполнить();
   
   ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
   
      
   Если ВыборкаДетальныеЗаписи.Следующий() Тогда
      Возврат ВыборкаДетальныеЗаписи.Ссылка;
   КонецЕсли;
   
   Возврат Неопределено;


КонецФункции // ПолучитьПроектТекущегоКалендаря()

&НаКлиенте
Процедура пр_КалендарьСотрудникаПриИзмененииПосле(Элемент)

   Объект.пр_Проект = ПолучитьПроектТекущегоКалендаря();
   
КонецПроцедуры




На форме выбрать Дополнительно - Календарь - выбрать событие ПриИзменении - ТипВызова - ВызыватьПосле.

Конфигурация - Обработки - ЖурналРегистрации - Формы - ЖурналРегистрации - Добавить в расширение.
Конфигурация - Справочники - Пользователи - Добавить в расширение.
Конфигурация - Роли - ПолныеПрава, АдминистраторСистемы, ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок - Добавить в расширение.

Создать непериодический и независимый регистр сведений - пр_НастройкиУведомленийПроектов.

Вкладка Данные указать:
Проект - Измерения
Остальное - Ресурсы
ИМЯ: Проект, МаксимальныйСрокАнализа, МаксимальныйСрокРазработки, ПользовательДляУведомленияПоАнализу, ПользовательДляУведомленияПоРазработке,
ТекстУведомленияПоАнализу, ТекстУведомленияПоРазработке, УведомлениеОДлительнойРазработке, УведомлениеОДлительномАнализе.
СИНОНИМ: Проект, Максимальный срок анализа (в днях), Максимальный срок разработки (в днях), Пользователь для уведомления, Пользователь для уведомления,
Текст уведомления, Текст уведомления, Уведомление о длительной разработке, Уведомление о длительном анализе.
ТИП: СправочникСсылка.Проекты, Число Длина=3 Точность=0 Неотрицательное, Число Длина=3 Точность=0 Неотрицательное, СправочникСсылка.Пользователи,
СправочникСсылка.Пользователи, Строка Длина=200, Строка Длина=200, Булево, Булево.


Добавить форму в регистр
Конструктор формы регистра сведений - Форма записи регистра сведений.

-Проект
-УведомлениеОДлительномАнализе
-УведомлениеОДлительнойРазработке
ВкладкиПоНастройкеУведомлений - Страницы
НастройкаУведомленийАнализа - Страница
  -МаксимальныйСрокАнализа
  -ПользовательДляУведомленияПоАнализу
  -ТекстУведомленияПоАнализу
НастройкаУведомленийРазработки - Страница
  -МаксимальныйСрокРазработки
  -ПользовательДляУведомленияПоРазработке
  -ТекстУведомленияПоРазработке

В МОДУЛЕ ВСТАВИТЬ КОД:
&НаСервере
Процедура ИзменениеДанныхРеквизитов()
     Элементы.НастройкаУведомленийРазработки.Видимость = Истина;
    Элементы.НастройкаУведомленийАнализа.Видимость = Истина;
    Если Запись.УведомлениеОДлительнойРазработке = Ложь Тогда
       Элементы.НастройкаУведомленийРазработки.Видимость = Ложь;
    КонецЕсли;
   
    Если Запись.УведомлениеОДлительномАнализе = Ложь Тогда
       Элементы.НастройкаУведомленийАнализа.Видимость = Ложь;
    КонецЕсли;

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
   
    ИзменениеДанныхРеквизитов();
   
КонецПроцедуры

&НаКлиенте
Процедура ПриИзмененииСтатусаОбУведомлении(Элемент)
   
   ИзменениеДанныхРеквизитов();
   
КонецПроцедуры



УведомлениеОДлительнойРазработке - Выбрать событие при изменении.


Создать справочник "пр_ОтправленныеУведомленияПоПросроченымЗаданиям" - Данные - Длина символов 150
Добавить реквизиты:
ИМЯ: ПросроченноеЗаданиеНаРаботу, ПроектЗаданияНаРаботу, КолонкаКалендаря, ПользовательПолучившийСообщение, ТекстовоеУведомление.
ТИП: ДокументСсылка.ЗаданиеНаРаботу, СправочникСсылка.Проекты, Строка Длина=100, СправочникСсылка.Пользователи, Строка Длина=200.
Добавить форму
Выделить "ТекстовоеУведомление" - МногострочныйРежим ДА,  АвтоМаксимальнаяШирина Ложь.


Создать константу "пр_ИдентификаторПомошника" - Тип УникальныйИдентификатор


Создать общий модуль "пр_ОтправкаУведомленийПоПросроченнымЗаданиям" - Свойства - ВызовСервера поставить галку

ОТКРЫТЬ МОДУЛЬ И ВСТАВИТЬ КОД:
Процедура ИнициализацияБота()
     УстановитьПривилегированныйРежим(Истина);
    Если Не ЗначениеЗаполнено(Константы.пр_ИдентификаторПомощника.Получить()) Тогда
       ПользовательИБПомошник = ПользователиИнформационнойБазы.СоздатьПользователя();
       ПользовательИБПомошник.Имя = "Помошник по просроченым заданиям";
       ПользовательИБПомошник.ПолноеИмя = "Помошник по просроченым заданиям";
        ПользовательИБПомошник.ПоказыватьВСпискеВыбора = Ложь;
       ПользовательИБПомошник.Записать();
       Константы.пр_ИдентификаторПомощника.Установить(ПользовательИБПомошник.УникальныйИдентификатор);
    КонецЕсли;
   
    Попытка
       ИдентификаторПользователяСВБотПомошник = СистемаВзаимодействия.ПолучитьИдентификаторПользователя(Константы.пр_ИдентификаторПомощника.Получить());
    Исключение
       ПользовательИБПомошник = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Константы.пр_ИдентификаторПомощника.Получить());
       ПользовательСВПомошник = СистемаВзаимодействия.СоздатьПользователя(ПользовательИБПомошник);
       ПользовательСВПомошник.Записать();
    КонецПопытки;
    УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры


Процедура ЗаписатьОтправкуУведомления(ПросроченноеЗаданиеНаРаботу, ПроектЗаданияНаРаботу,
   КолонкаКалендаря, ПользовательПолучившийСообщение, ТекстУведомления)
   
   НоваяЗаписьУведомления = Справочники.пр_ОтправленныеУведомленияПоПросроченымЗаданиям.СоздатьЭлемент();
   НоваяЗаписьУведомления.Наименование = "Отправленное сообщение " + Строка(ПользовательПолучившийСообщение) + " по " + Строка(ПросроченноеЗаданиеНаРаботу);
   НоваяЗаписьУведомления.ПросроченноеЗаданиеНаРаботу = ПросроченноеЗаданиеНаРаботу;
   НоваяЗаписьУведомления.ПроектЗаданияНаРаботу = ПроектЗаданияНаРаботу;
   НоваяЗаписьУведомления.КолонкаКалендаря = КолонкаКалендаря;
   НоваяЗаписьУведомления.ПользовательПолучившийСообщение = ПользовательПолучившийСообщение;
   НоваяЗаписьУведомления.ТекстовоеУведомление = ТекстУведомления;
   
   НоваяЗаписьУведомления.Записать();
   

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

Процедура ОтправкаУведомления() Экспорт

   Если Не СистемаВзаимодействия.ИнформационнаяБазаЗарегистрирована() Тогда
      Возврат;
   КонецЕсли;
   
   ИнициализацияБота();
   
      //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
   // Данный фрагмент построен конструктором.
   // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
   
   Запрос = Новый Запрос;
   Запрос.Текст =
      "ВЫБРАТЬ
      |   ЗаданиеНаРаботу.Ссылка КАК Задание,
      |   ЗаданиеНаРаботу.пр_Проект КАК Проект,
      |   ЗаписиКалендаряСотрудника.КолонкаКалендаря.пр_МеткаКолонки КАК КолонкаКалендаря,
      |   ЗаданиеНаРаботу.пр_ДатаНачалаАнализа КАК ДатаОтсчета,
      |   ""Анализ"" КАК ЭтапУведомления,
      |   пр_НастройкиУведомленийПроектов.МаксимальныйСрокАнализа КАК МаксимальныйСрок,
      |   пр_НастройкиУведомленийПроектов.ПользовательДляУведомленияПоАнализу КАК ПользовательДляУведомления,
      |   пр_НастройкиУведомленийПроектов.ТекстУведомленияПоАнализу КАК ТекстУведомления
      |ПОМЕСТИТЬ ВТ_ЗаданияДляУведомлений
      |ИЗ
      |   Справочник.ЗаписиКалендаряСотрудника КАК ЗаписиКалендаряСотрудника
      |      ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаданиеНаРаботу КАК ЗаданиеНаРаботу
      |       ПО ЗаписиКалендаряСотрудника.Календарь = ЗаданиеНаРаботу.КалендарьСотрудника
      |           И ЗаписиКалендаряСотрудника.Источник = ЗаданиеНаРаботу.Ссылка
      |           И (НЕ ЗаданиеНаРаботу.ПометкаУдаления)
      |      ЛЕВОЕ СОЕДИНЕНИЕ Справочник.пр_ОтправленныеУведомленияПоПросроченымЗаданиям КАК пр_ОтправленныеУведомленияПоПросроченымЗаданиям
      |      ПО (ЗаданиеНаРаботу.Ссылка = пр_ОтправленныеУведомленияПоПросроченымЗаданиям.ПросроченноеЗаданиеНаРаботу)
      |      ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.пр_НастройкиУведомленийПроектов КАК пр_НастройкиУведомленийПроектов
      |      ПО (ЗаданиеНаРаботу.пр_Проект = пр_НастройкиУведомленийПроектов.Проект)
      |ГДЕ
      |   НЕ ЗаписиКалендаряСотрудника.ПометкаУдаления
      |   И пр_ОтправленныеУведомленияПоПросроченымЗаданиям.ПросроченноеЗаданиеНаРаботу ЕСТЬ NULL
      |   И ЗаписиКалендаряСотрудника.КолонкаКалендаря.пр_МеткаКолонки = ""Анализ""
      |   И пр_НастройкиУведомленийПроектов.УведомлениеОДлительномАнализе
      |   И ЗаданиеНаРаботу.пр_ДатаНачалаАнализа <> ДАТАВРЕМЯ(1, 1, 1)
      |
      |ОБЪЕДИНИТЬ ВСЕ
      |
      |ВЫБРАТЬ
      |   ЗаданиеНаРаботу.Ссылка,
      |   ЗаданиеНаРаботу.пр_Проект,
      |   ЗаписиКалендаряСотрудника.КолонкаКалендаря.пр_МеткаКолонки,
      |   ЗаданиеНаРаботу.пр_ДатаНачалаРазработки,
      |   ""Разработка"",
      |   пр_НастройкиУведомленийПроектов.МаксимальныйСрокРазработки,
      |   пр_НастройкиУведомленийПроектов.ПользовательДляУведомленияПоРазработке,
      |   пр_НастройкиУведомленийПроектов.ТекстУведомленияПоРазработке
      |ИЗ
      |   Справочник.ЗаписиКалендаряСотрудника КАК ЗаписиКалендаряСотрудника
      |      ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаданиеНаРаботу КАК ЗаданиеНаРаботу
      |      ПО ЗаписиКалендаряСотрудника.Календарь = ЗаданиеНаРаботу.КалендарьСотрудника
      |         И ЗаписиКалендаряСотрудника.Источник = ЗаданиеНаРаботу.Ссылка
      |         И (НЕ ЗаданиеНаРаботу.ПометкаУдаления)
      |      ЛЕВОЕ СОЕДИНЕНИЕ Справочник.пр_ОтправленныеУведомленияПоПросроченымЗаданиям КАК пр_ОтправленныеУведомленияПоПросроченымЗаданиям
      |      ПО (ЗаданиеНаРаботу.Ссылка = пр_ОтправленныеУведомленияПоПросроченымЗаданиям.ПросроченноеЗаданиеНаРаботу)
      |      ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.пр_НастройкиУведомленийПроектов КАК пр_НастройкиУведомленийПроектов
      |      ПО (ЗаданиеНаРаботу.пр_Проект = пр_НастройкиУведомленийПроектов.Проект)
      |ГДЕ
      |   НЕ ЗаписиКалендаряСотрудника.ПометкаУдаления
      |   И пр_ОтправленныеУведомленияПоПросроченымЗаданиям.ПросроченноеЗаданиеНаРаботу ЕСТЬ NULL
      |   И ЗаписиКалендаряСотрудника.КолонкаКалендаря.пр_МеткаКолонки = ""В работе""
      |   И пр_НастройкиУведомленийПроектов.УведомлениеОДлительнойРазработке
      |   И ЗаданиеНаРаботу.пр_ДатаНачалаРазработки <> ДАТАВРЕМЯ(1, 1, 1)
      |;
      |
      |////////////////////////////////////////////////////////////////////////////////
      |ВЫБРАТЬ
      |   МИНИМУМ(ВТ_ЗаданияДляУведомлений.ДатаОтсчета) КАК ДатаОтсчета
      |ПОМЕСТИТЬ ВТ_МинимальнаяДатаОтсчета
      |ИЗ
      |   ВТ_ЗаданияДляУведомлений КАК ВТ_ЗаданияДляУведомлений
      |;
      |
      |////////////////////////////////////////////////////////////////////////////////
      |ВЫБРАТЬ
      |   ДанныеПроизводственногоКалендаря.Дата КАК Дата,
      |   ДанныеПроизводственногоКалендаря.ВидДня КАК ВидДня
      |ПОМЕСТИТЬ ВТ_ДниДляРасчета
      |ИЗ
      |   ВТ_МинимальнаяДатаОтсчета КАК ВТ_МинимальнаяДатаОтсчета
      |      ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
      |      ПО ВТ_МинимальнаяДатаОтсчета.ДатаОтсчета = ДанныеПроизводственногоКалендаря.Дата
      |ГДЕ
      |   ДанныеПроизводственногоКалендаря.Дата <= &ТекущаяДата
      |   И ДанныеПроизводственногоКалендаря.ПроизводственныйКалендарь.Код = ""РФ""
      |;
      |
      |////////////////////////////////////////////////////////////////////////////////
      |ВЫБРАТЬ
      |   ОсновныеДни.Дата КАК Дата,
      |   КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РабочиеДниПослеВключая.Дата) КАК РабочихДнейДоТекущейДаты
      |ПОМЕСТИТЬ ВТ_РасчетКоличестваРабочихДней
      |ИЗ
      |   ВТ_ДниДляРасчета КАК ОсновныеДни
      |      ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ДниДляРасчета КАК РабочиеДниПослеВключая
      |      ПО ОсновныеДни.Дата <= РабочиеДниПослеВключая.Дата
      |         И (РабочиеДниПослеВключая.ВидДня В (ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий), ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный)))
      |
      |СГРУППИРОВАТЬ ПО
      |   ОсновныеДни.Дата
      |
      |ИНДЕКСИРОВАТЬ ПО
      |   Дата
      |;
      |
      |////////////////////////////////////////////////////////////////////////////////
      |ВЫБРАТЬ
      |   ВТ_ЗаданияДляУведомлений.Задание КАК Задание,
      |   ВТ_ЗаданияДляУведомлений.Задание.Сотрудник КАК Ответственный,
      |   ВТ_ЗаданияДляУведомлений.Задание.Номер КАК Номер,
      |   ВТ_ЗаданияДляУведомлений.Проект КАК Проект,
      |   ВТ_ЗаданияДляУведомлений.КолонкаКалендаря КАК КолонкаКалендаря,
      |   ВТ_ЗаданияДляУведомлений.ЭтапУведомления КАК ЭтапУведомления,
      |   ВТ_ЗаданияДляУведомлений.ПользовательДляУведомления КАК ПользовательДляУведомления,
      |   ПРЕДСТАВЛЕНИЕ(ВТ_ЗаданияДляУведомлений.ПользовательДляУведомления) КАК ПользовательДляУведомленияПредставление,
      |   ВТ_ЗаданияДляУведомлений.ТекстУведомления КАК ТекстУведомления,
      |   ВТ_ЗаданияДляУведомлений.МаксимальныйСрок КАК МаксимальныйСрок,
      |   ВТ_ЗаданияДляУведомлений.ПользовательДляУведомления.ИдентификаторПользователяИБ КАК ИдентификаторПользователяИБ
      |ИЗ
      |   ВТ_ЗаданияДляУведомлений КАК ВТ_ЗаданияДляУведомлений
      |      ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_РасчетКоличестваРабочихДней КАК ВТ_РасчетКоличестваРабочихДней
      |      ПО ВТ_ЗаданияДляУведомлений.ДатаОтсчета = ВТ_РасчетКоличестваРабочихДней.Дата
      |ГДЕ
      |   ВТ_ЗаданияДляУведомлений.МаксимальныйСрок < ВТ_РасчетКоличестваРабочихДней.РабочихДнейДоТекущейДаты";
   
   Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса());
   
   Выборка = Запрос.Выполнить().Выбрать();
   
   
   Пока Выборка.Следующий() Цикл    
      
   Попытка
         
      Если Выборка.ПользовательДляУведомленияПредставление = "Бакинская Валентина Станиславовна" Тогда
         ВызватьИсключение "Специальная ошибка";
      КонецЕсли;
      
      ПользовательИБ = Неопределено;
      ПользовательСВ = Неопределено;
      
      ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Выборка.ИдентификаторПользователяИБ);
      
      Если ПользовательИБ = Неопределено Тогда
         Продолжить;
      КонецЕсли;
      
      Попытка
         ИдентификаторПользователяСВ = СистемаВзаимодействия.ПолучитьИдентификаторПользователя(ПользовательИБ.УникальныйИдентификатор);
         ПользовательСВ = СистемаВзаимодействия.ПолучитьПользователя(ИдентификаторпользователяСВ);
      Исключение
         ПользовательСВ = СистемаВзаимодействия.СоздатьПользователя(ПользовательИБ);
         ПользовательСВ.Записать();
      КонецПопытки;
      
      ИдентификаторПользователяСВ = ПользовательСВ.Идентификатор;
      
      ПользовательИББотПомошник = ПользователиИнформационнойБазы.НайтиПоИмени("Помошник по просроченым заданиям");
      ИдентификаторПользователяСВБотПомошник = СистемаВзаимодействия.ПолучитьИдентификаторПользователя(ПользовательИББотПомошник.УникальныйИдентификатор);
      
      Если ИдентификаторПользователяСВ <> ИдентификаторПользователяСВБотПомошник Тогда
         КлючОбсуждения = Строка(ИдентификаторПользователяСВБотПомошник) + " - " + Строка(ИдентификаторПользователяСВ);
         Обсуждение = СистемаВзаимодействия.ПолучитьОбсуждение(КлючОбсуждения);
         Если Обсуждение = Неопределено Тогда
            Обсуждение = СистемаВзаимодействия.СоздатьОбсуждение();
            Обсуждение.Групповое = Ложь;
            Обсуждение.Ключ = КлючОбсуждения;
            Обсуждение.Участники.Добавить(ИдентификаторПользователяСВБотПомошник);
            Обсуждение.Участники.Добавить(ИдентификаторПользователяСВ);
            Обсуждение.Записать();
         КонецЕсли;
         
         Сообщение = СистемаВзаимодействия.СоздатьСообщение(Обсуждение.Идентификатор);
         Сообщение.Автор = ИдентификаторПользователяСВБотПомошник;
         
         Текст = Выборка.ТекстУведомления;
         
         Если Выборка.ЭтапУведомления = "Анализ" Тогда
            Текст = СтрЗаменить(Текст, "[Дней_На_Анализ]", Выборка.МаксимальныйСрок);
         Иначе
            Текст = СтрЗаменить(Текст, "[Дней_На_Разработку]", Выборка.МаксимальныйСрок);
         КонецЕсли;
         
         Текст = СтрЗаменить(Текст, "[Ответственный]", Выборка.Ответственный);
         Текст = СтрЗаменить(Текст, "[НомерЗадания]", Строка(Число(Прав(Строка(Выборка.Номер), 6))));
         
         Сообщение.Текст = Новый ФорматированнаяСтрока(Текст,,,,Строка(ПолучитьНавигационнуюСсылку(Выборка.Задание)));
         Сообщение.Записать();
         
         ЗаписатьОтправкуУведомления(Выборка.Задание, Выборка.Проект, Строка(Выборка.КолонкаКалендаря), Выборка.ПользовательДляУведомления, Текст);
         
         ЖурналРегистрации.ДобавитьСообщениеДляЖурналаРегистрации("Уведомление отправлено успешно",
         УровеньЖурналаРегистрации.Информация,
         Метаданные.ОбщиеМодули.пр_ОтправкаУведомленийПоПросроченнымЗаданиям,
         "Задание: " + Строка(Выборка.Задание) + ", Получатель: " + Выборка.ПользовательДляУведомленияПредставление
         + ", Проект: " + Строка(Выборка.Проект) + ", Текст уведомления: " + Строка(Текст),
         "Уведомление о просроченом задании было успешно отправлено");
      КонецЕсли;
      
      
   Исключение
      ЖурналРегистрации.ДобавитьСообщениеДляЖурналаРегистрации("Уведомление не отправлено",
      УровеньЖурналаРегистрации.Предупреждение,
      Метаданные.ОбщиеМодули.пр_ОтправкаУведомленийПоПросроченнымЗаданиям,
      "Задание: " + Строка(Выборка.Задание) + ", Получатель: " + Строка(Выборка.ПользовательДляУведомленияПредставление)
      + ", Проект: " + Строка(Выборка.Проект) + ", Текст уведомления: Отсутствует",
      "Уведомление не было отправлено, при отправке возниккла непредвиденая ошибка");
   КонецПопытки;
   
  КонецЦикла;
   
КонецПроцедуры





Создать обработку "пр_НастройкиУведомлений"
Добавить реквизиты:
ИМЯ: Проект, МаксимальныйСрокАнализа, МаксимальныйСрокРазработки, ПользовательДляУведомленияПоАнализу, ПользовательДляУведомленияПоРазработке,
СправкаОПодставляемыхПеременных, ТекстУведомленияПоАнализу, ТекстУведомленияПоРазработке, УведомлениеОДлительнойРазработке, УведомлениеОДлительномАнализе.
СИНОНИМ: Проект, Максимальный срок анализа (в днях), Максимальный срок разработки (в днях), Пользователь для уведомления, Пользователь для уведомления,
Справка о подставляемых переменных, Текст уведомления, Текст уведомления, Уведомление о длительной разработке, Уведомление о длительном анализе.
ТИП: СправочникСсылка.Проекты, Число Длина=3 Точность=0 Неотрицательное, Число Длина=3 Точность=0 Неотрицательное, СправочникСсылка.Пользователи,
СправочникСсылка.Пользователи, Строка, Строка Длина=200, Строка Длина=200, Булево, Булево.

Перейти на вкладку Команды - Команда формы
Добавить команды: ОткрытьЖурналЛогов(Заголовок - Журнал), ОтправитьУведомлениеПоПросроченнымЗаданиямНаРаботу, СохранитьНастройки.

Перейти на вкладку Параметры - Добавить Проект - СправочникПроекты - КлючевойПараметр галочку поставить

Расположение:
КоманднаяПанель
  -СохранитьНастройки
  -ОтправитьУведомлениеПоПросроченнымЗаданиямНаРабот
  -ОткрытьЖурналЛогов
Проект
ОсновныеДанные - Обычная группа
  -УведомлениеОДлительнойРазработке
  -УведомлениеОДлительномАнализе
ВкладкиПоНастройкеУыедомлений - Страницы
-СтраницаСправкаОПодставляемыхПеременных - Страница
   -СправкаОПодставляемыхПеременных
-НастройкаУведомленийРазработки - Страница
   -МаксимальныйСрокРазработки
   -ПользовательДляУведомленияПоРазработке
   -ТекстУведомленияПоРазработке
-НастройкаУведомленийАнализа - Страница
   -МаксимальныйСрокАнализа
   -ПользовательДляУведомленияПоАнализу
   -ТекстУведомленияПоАнализу

СправкаОПодставляемыхПеременных - МногострочныйРежим
ТекстУведомленияПоАнализу - Ширина 100, Высота 2


ПЕРЕЙТИ НА МОДУЛЬ И ВСТАВИТЬ КОД:
&НаСервере
Процедура ИзменениеДанныхРеквизитов()

   СправкаОПодставляемыхПеременных = "Есть специальные параметры, которые можно вставлять в текст уведомлений, которые отвечают за какие-то данные"
   + Символы.ПС + Символы.ПС + "Есть следующие параметры: " + Символы.ПС
   + "[Дней_На_Анализ] - Хранит в себе данные текущего максимального срока по анализу;" + Символы.ПС
   + "[Дней_На_Разработку] - Хранит в себе данные текущего максимального срока по разработке;" + Символы.ПС
   + "[НомерЗадания] (Обязательный) - Хранит в себе данные текущего номера задания;" + Символы.ПС
   + "[Ответственный] - Хранит в себе данные текущего пользователя, который получи уведомление;" + Символы.ПС
   + "[Стадия] - Хранит в себе данные текущей стадии по которой придёт увдомление.";
   
   Если УведомлениеОДлительнойРазработке = Ложь Тогда
      Элементы.НастройкаУведомленийРазработки.Видимость = Ложь;
      МаксимальныйСрокРазработки = Неопределено;
      ПользовательДляУведомленияПоРазработке = Неопределено;
      ТекстУведомленияПоРазработке = Неопределено;
   Иначе
      Элементы.НастройкаУведомленийРазработки.Видимость = Истина;
      СправкаОПодставляемыхПеременных = СправкаОПодставляемыхПеременных + Символы.ПС + Символы.ПС + "Пример №1" +
      + "([Дней_На_Разработку] дней), ответственный по заданию - [Ответственный]." + Символы.ПС + "Пример полученного сообщения с текущими настройками:"
      + "По заданию №17 на стадии ""В работе"" превышен срок выполнения "
      + "(" + Строка(МаксимальныйСрокРазработки) + " дней), ответственный по заданию - "
      + Строка(ПользовательДляУведомленияПоРазработке) + ".";
   КонецЕсли;
   
   
   Если УведомлениеОДлительномАнализе = Ложь Тогда
      Элементы.НастройкаУведомленийАнализа.Видимость = Ложь;
      МаксимальныйСрокАнализа = Неопределено;
      ПользовательДляУведомленияПоАнализу = Неопределено;
      ТекстУведомленияПоАнализу = Неопределено;
   Иначе
      Элементы.НастройкаУведомленийАнализа.Видимость = Истина;
      
   Если УведомлениеОДлительномАнализе = Ложь Тогда   
      СправкаОПодставляемыхПеременных = СправкаОПодставляемыхПеременных + Символы.ПС + Символы.ПС + "Пример №1";
   Иначе
      СправкаОПодставляемыхПеременных = СправкаОПодставляемыхПеременных + Символы.ПС + Символы.ПС + "Пример №2";
   КонецЕсли;
       СправкаОПодставляемыхПеременных = СправкаОПодставляемыхПеременных +
      Символы.ПС + "Пример текста уведомления: По заданию №[НомерЗадания] на стадии ""[Стадия]"" превышен срок выполнения "
      + "([Дней_На_Анализ] дней), ответственный по заданию - [Ответственный]." + Символы.ПС + "Пример полученного сообщения с текущими настройками:"
      + "По заданию №17 на стадии ""В работе"" превышен срок выполнения "
      + "(" + Строка(МаксимальныйСрокАнализа) + " дней), ответственный по заданию - "
      + Строка(ПользовательДляУведомленияПоАнализу) + ".";
   КонецЕсли;
   
КонецПроцедуры


&НаСервере
Процедура ПолучитьНастройкиПроекта()

   Запрос = Новый Запрос;
   Запрос.Текст =
      "ВЫБРАТЬ
      |   пр_НастройкиУведомленийПроектов.МаксимальныйСрокАнализа КАК МаксимальныйСрокАнализа,
      |   пр_НастройкиУведомленийПроектов.МаксимальныйСрокРазработки КАК МаксимальныйСрокРазработки,
      |   пр_НастройкиУведомленийПроектов.ПользовательДляУведомленияПоАнализу КАК ПользовательДляУведомленияПоАнализу,
      |   пр_НастройкиУведомленийПроектов.ПользовательДляУведомленияПоРазработке КАК ПользовательДляУведомленияПоРазработке,
      |   пр_НастройкиУведомленийПроектов.ТекстУведомленияПоАнализу КАК ТекстУведомленияПоАнализу,
      |   пр_НастройкиУведомленийПроектов.ТекстУведомленияПоРазработке КАК ТекстУведомленияПоРазработке,
      |   пр_НастройкиУведомленийПроектов.УведомлениеОДлительнойРазработке КАК УведомлениеОДлительнойРазработке,
      |   пр_НастройкиУведомленийПроектов.УведомлениеОДлительномАнализе КАК УведомлениеОДлительномАнализе
      |ИЗ
      |   РегистрСведений.пр_НастройкиУведомленийПроектов КАК пр_НастройкиУведомленийПроектов
      |ГДЕ
      |   пр_НастройкиУведомленийПроектов.Проект = &Проект";
   
   Запрос.УстановитьПараметр("Проект", Проект);
   
   Выборка = Запрос.Выполнить().Выбрать();

   Если Выборка.Следующий() Тогда
      УведомлениеОДлительномАнализе = Выборка.УведомлениеОДлительномАнализе;
      УведомлениеОДлительнойРазработке = Выборка.УведомлениеОДлительнойРазработке;
      МаксимальныйСрокАнализа = Выборка.МаксимальныйСрокАнализа;
      МаксимальныйСрокРазработки = Выборка.МаксимальныйСрокРазработки;
      ПользовательДляУведомленияПоАнализу = Выборка.ПользовательДляУведомленияПоАнализу;
      ПользовательДляУведомленияПоРазработке = Выборка.ПользовательДляУведомленияПоРазработке;
      ТекстУведомленияПоАнализу = Выборка.ТекстУведомленияПоАнализу;
      ТекстУведомленияПоРазработке = Выборка.ТекстУведомленияПоРазработке;
   Иначе
      УведомлениеОДлительномАнализе = Неопределено;
      УведомлениеОДлительнойРазработке = Неопределено;
      МаксимальныйСрокАнализа = Неопределено;
      МаксимальныйСрокРазработки = Неопределено;
       ПользовательДляУведомленияПоАнализу = Неопределено;
      ПользовательДляУведомленияПоРазработке = Неопределено;
      ТекстУведомленияПоАнализу = Неопределено;
      ТекстУведомленияПоРазработке = Неопределено;
   КонецЕсли;
   
   ИзменениеДанныхРеквизитов();
   
КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
   
   Элементы.ОсновныеДанные.Видимость = Ложь;
   Проект = Параметры.Проект;
   
   Если Проект <> Неопределено Тогда
      Элементы.ОсновныеДанные.Видимость = Истина;
      ПолучитьНастройкиПроекта();
   КонецЕсли;
   
   
КонецПроцедуры

&НаКлиенте
Процедура ПроектПриИзменении(Элемент)
   
   Элементы.ОсновныеДанные.Видимость = Ложь;
   Если Не Проект.Пустая()Тогда
      Элементы.ОсновныеДанные.Видимость = Истина;
      ПолучитьНастройкиПроекта();
   КонецЕсли;
   
   
КонецПроцедуры

&НаКлиенте
Процедура УведомлениеОДлительнойРазработкеПриИзменении(Элемент)
   
   ИзменениеДанныхРеквизитов();
   
КонецПроцедуры

&НаКлиенте
Процедура УведомлениеОДлительномАнализеПриИзменении(Элемент)
   
   ИзменениеДанныхРеквизитов();
    
КонецПроцедуры

&НаКлиенте
Процедура ПриИзмененииДаныхУведомлений(Элемент)

   Если ЗначениеЗаполнено(МаксимальныйСрокАнализа) И ЗначениеЗаполнено(ПользовательДляУведомленияПоАнализу)
      И Не ЗначениеЗаполнено(ТекстУведомленияПоАнализу) Тогда
      ТекстУведомленияПоАнализу = "По заданию №[НомерЗадания] на стадии ""[Стадия]"" превышен срок выполнения"
      + "([Дней_На_Анализ] дней), ответственный по заданию - [Ответственный].";
   КонецЕсли;
   
   Если ЗначениеЗаполнено(МаксимальныйСрокРазработки) И ЗначениеЗаполнено(ПользовательДляУведомленияПоРазработке)
      И Не ЗначениеЗаполнено(ТекстУведомленияПоРазработке) Тогда
      ТекстУведомленияПоРазработке = "По заданию №[НомерЗадания] на стадии ""[Стадия]"" превышен срок выполнения"
      + "([Дней_На_Разработку] дней), ответственный по заданию - [Ответственный].";
   КонецЕсли;
   
       ИзменениеДанныхРеквизитов();
      
   КонецПроцедуры
   
   
 &НаСервере
 Функция ПроверитьПравильностьУведомлений()
 
    ТекстУведомленияПоАнализуВерен = Истина;
   ТекстУведомленияПоРазработкеВерен = Истина;
   
   Если СтрНайти(ТекстУведомленияПоАнализу, "[НомерЗадания]") <= 0 И УведомлениеОДлительномАнализе = Истина Тогда
      ТекстУведомленияПоАнализуВерен = Ложь;
      ОбщегоНазначения.СообщитьПользователю("В тексте уведомления по анализу нет или неправильно написан обязательный параметр([НомерЗадания]).");
   КонецЕсли;
   
   Если СтрНайти(ТекстУведомленияПоРазработке, "[НомерЗадания]") <= 0 И УведомлениеОДлительнойРазработке = Истина Тогда
      ТекстУведомленияПоРазработкеВерен = Ложь;
      ОбщегоНазначения.СообщитьПользователю("В тексте уведомления по разработке нет или неправильно написан обязательный параметр([НомерЗадания]).");
   КонецЕсли;
   
   Если ТекстУведомленияПоРазработкеВерен = Ложь Или ТекстУведомленияПоАнализуВерен = Ложь Тогда
      Возврат Ложь;
   КонецЕсли;
   
   Возврат Истина;
   
   
 
 КонецФункции // ПроверитьПравильностьУведомлений()
 

  &НаСервере
  Процедура ЗаписатьНастройкиУведомлений()
 
     ТекущиеНастройкиПроекта = РегистрыСведений.пр_НастройкиУведомленийПроектов.СоздатьМенеджерЗаписи();
   
   ТекущиеНастройкиПроекта.Проект = Проект;
   ТекущиеНастройкиПроекта.МаксимальныйСрокАнализа = МаксимальныйСрокАнализа;
   ТекущиеНастройкиПроекта.МаксимальныйСрокРазработки  = МаксимальныйСрокРазработки;
   ТекущиеНастройкиПроекта.ПользовательДляУведомленияПоАнализу = ПользовательДляУведомленияПоАнализу;
   ТекущиеНастройкиПроекта.ПользовательДляУведомленияПоРазработке = ПользовательДляУведомленияПоРазработке;
   ТекущиеНастройкиПроекта.УведомлениеОДлительномАнализе = УведомлениеОДлительномАнализе;
   ТекущиеНастройкиПроекта.УведомлениеОДлительнойРазработке = УведомлениеОДлительнойРазработке;
   ТекущиеНастройкиПроекта.ТекстУведомленияПоАнализу = ТекстУведомленияПоАнализу;
   ТекущиеНастройкиПроекта.ТекстУведомленияПоРазработке = ТекстУведомленияПоРазработке;
   ТекущиеНастройкиПроекта.Записать(Истина);
 
  КонецПроцедуры

&НаКлиенте
  Процедура СохранитьНастройки(Команда)
    
     ЗаписатьНастройкиУведомлений();
     ПоказатьОповещениеПользователя("Настройки сохранены");
    
  КонецПроцедуры
 

&НаКлиенте
  Процедура ОткрытьЖурналЛогов(Команда)
    
     МассивСобытий = Новый Массив;
     МассивСобытий.Добавить("Уведомление отправлено успешно");
     МассивСобытий.Добавить("Уведомление не отправлено");
    
     ПередаваемыеПарметры = Новый Структура("СобытиеЖурналаРегистрации", МассивСобытий);
    
     ОткрытьФорму("Обработка.ЖурналРегистрации.Форма.ЖурналРегистрации", ПередаваемыеПарметры);
  КонецПроцедуры
 
 

&НаКлиенте
  Процедура ОтправитьУведомлениеПоПросроченнымЗаданиямНаРаботу(Команда)
    
     пр_ОтправкаУведомленийПоПросроченнымЗаданиям.ОтправкаУведомления();
    
 КонецПроцедуры



Проект - Событие - ПроектПриИзменении
УведомлениеОДлительнойРазработке - Событие - УведомлениеОДлительнойРазработкеПриИзменении
УведомлениеОДлительномАнализе - Событие - УведомлениеОДлительномАнализеПриИзменении
МаксимальныйСрокРазработки - Событие - ПриИзмененииДанныхУведомлений

У команд СохранитьНастройки, ОтправитьУведомлениеПоПросроченнымЗаданиямНаРаботу, ОтправитьЖурналЛогов - Выбрать действия




Найти в конфигурации обработку "КонтактЦентр" - зайти на Формы - Форма
Найти в модуле процедуру "УправлениеФормой()", тыкнуть по ней ПКМ и добавить в расширение
В окне "ТипВызова" выбрать "Вызвать вместо(с контролем)" и нажмите кнопку ОК


ПОСЛЕ "// Вид отображения "Доски"
   Элементы.Доски.Видимость = ВидыКонтактЦентра = 3;
   Элементы.ФормаПоказыватьНедействительные.Видимость = ВидыКонтактЦентра = 3;"
 
И ДО "// Вид отображения "Текущая доска"
   Элементы.СтраницыДоска.Видимость = ВидыКонтактЦентра = 4;
   Элементы.СтраницыДоска.Видимость = ВидыКонтактЦентра = 4;"

ВСТАВИТЬ КОД:
#Вставка
   Если Элементы.Найти("пр_ОткрытьНастройкйУведомлений") = Неопределено Тогда
      
      МояКоманда = Команды.Добавить("пр_ОткрытьНастройкиУведомленийПроекта");
      МояКоманда.Заголовок = "Открыть настройки уведомлений проекта";
      МояКоманда.Действие = "пр_ОткрытьНастройкиУведомлений";
      
      МояКнопка = Элементы.Добавить("пр_ОткрытьНастройкиУведомлений", Тип("КнопкаФормы"), Элементы.ГруппаКоманднаяПанель);
      МояКнопка.Заголовок = "Открыть настройки уведомлений";
      МояКнопка.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
      МояКнопка.ИмяКоманды = "пр_ОткрытьНастройкиУведомленийПроекта";
      МояКнопка.Видимость = ВидыКонтактЦентра = 4;
      
      МояКоманда = Команды.Добавить("пр_ОткрытьЖурналЛогово");
      МояКоманда.Заголовок = "Открыть журнал логов";
      МояКоманда.Действие = "пр_ОткрытьЖурнал";
      
      МояКнопка = Элементы.Добавить("пр_ОткрытьЖурнал", Тип("КнопкаФормы"), Элементы.ГруппаКоманднаяПанель);
      МояКнопка.Заголовок = "Открыть журнал";
      МояКнопка.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
      МояКнопка.ИмяКоманды = "пр_ОткрытьЖурналЛогово";
      МояКнопка.Видимость = ВидыКонтактЦентра = 4;
      
      МояКоманда = Команды.Добавить("пр_ОтправитьУведомлениеПоПросроченнымЗаданиямНаРаботу");
      МояКоманда.Заголовок = "Отправить уведомления по просроченным заданиям на работу";
      МояКоманда.Действие = "пр_ОтправитьУведомлениеПоПросроченнымЗаданиям";
      
      МояКнопка = Элементы.Добавить("пр_ОтправитьУведомлениеПоПросроченнымЗаданиям", Тип("КнопкаФормы"), Элементы.ГруппаКоманднаяПанель);
      МояКнопка.Заголовок = "Отправить уведомление по просроченным заданиям на работу";
      МояКнопка.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
      МояКнопка.ИмяКоманды = "пр_ОтправитьУведомлениеПоПросроченнымЗаданиямНаРаботу";
      МояКнопка.Видимость = ВидыКонтактЦентра = 4;
   Иначе
      Элементы.Найти("пр_ОткрытьНастройкиУведомлений").Видимость = ВидыКонтактЦентра = 4;
      Элементы.Найти("пр_ОткрытьЖурнал").Видимость = ВидыКонтактЦентра = 4;
      Элементы.Найти("пр_ОтправитьУведомлениеПоПросроченнымЗаданиям").Видимость = ВидыКонтактЦентра = 4;
   КонецЕсли;
#КонецВставки



ПОСЛЕ ЭТОЙ ПРОЦЕДУРЫ ВСТАВИТЬ КОД:
&НаСервере
Функция ПолучитьПроектКалендаря()

      //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
   // Данный фрагмент построен конструктором.
   // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
   
   Запрос = Новый Запрос;
   Запрос.Текст =
      "ВЫБРАТЬ
      |   Проекты.Ссылка КАК Ссылка
      |ИЗ
      |   Справочник.Проекты КАК Проекты
      |ГДЕ
      |   Проекты.пр_КалендарьСотрудника = &пр_КалендарьСотрудника";
   
   Запрос.УстановитьПараметр("пр_КалендарьСотрудника", ТекущаяДоска);
   
   РезультатЗапроса = Запрос.Выполнить();
   ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

   Если ВыборкаДетальныеЗаписи.Следующий() Тогда
      
      Возврат ВыборкаДетальныеЗаписи.Ссылка;
      
   КонецЕсли;
   
   Возврат Неопределено;
   

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


&НаКлиенте
Процедура пр_ОткрытьНастройкиУведомлений()

   ПередаваемыеПараметры = Новый Структура("Проект", ПолучитьПроектКалендаря());
   ОткрытьФорму("Обработка.пр_НастройкиУведомлений.Форма.Форма", ПередаваемыеПараметры);

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

&НаКлиенте
Процедура пр_ОткрытьЖурнал()

   МассивСобытий = Новый Массив;
   МассивСобытий.Добавить("Уведомление отправлено успешно");
   МассивСобытий.Добавить("Уведомление не отправлено");
   
   ПередавемыеПараметры = Новый Структура("СобытиеЖурналаРегистрации", МассивСобытий);
   ОткрытьФорму("Обработка.ЖурналРегистрации.Форма.ЖурналРегистрации", ПередавемыеПараметры);

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

&НаКлиенте
Процедура пр_ОтправитьУведомлениеПоПросроченнымЗаданиям()

   пр_ОтправкаУведомленийПоПросроченнымЗаданиям.ОтправкаУведомления();

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



В подсистему Работы добавить: пр_ОтправленныеУведомленияПоПросроченымЗаданиям, пр_НастройкиУведомлений, пр_НастройкиУведомленийПроектов.


Создать внешнюю обработку
Файл - Новый - ВнешняяОбработка
Имя: РегламентноеЗаданиеОтправкиПросроченныхЗаданийНаРаботу.

ВСТАВИТЬ КОД(действия - открыть модуль):
Функция СведенияОВнешнейОбработке() Экспорт

 РегламентныеДанные = Новый Структура;
 РегламентныеДанные.Вставить("Наименование", "Регламентное задание отправки просроченных заданий на работу");
 РегламентныеДанные.Вставить("Информация", "Регламентное задание отправки просроченных заданий на работу");
 РегламентныеДанные.Вставить("ВерсияБСП", "2.1.8.1");
 РегламентныеДанные.Вставить("Версия", "1.0");
 РегламентныеДанные.Вставить("ФормированиеФоновогоЗадания", Истина);
 РегламентныеДанные.Вставить("Вид", "ДополнительнаяОбработка");
 
 ТЗКоманд = Новый ТаблицаЗначений;
 ТЗКоманд.Колонки.Добавить("Идентификатор");
 ТЗКоманд.Колонки.Добавить("Представление");
 ТЗКоманд.Колонки.Добавить("Использование");
 ТЗКоманд.Колонки.Добавить("ПоказыватьОповещение");
 
 СтрокаКоманды = ТЗКоманд.Добавить();
 СтрокаКоманды.Идентификатор = "Регламентное задание отправки просроченных заданий на работу";
 СтрокаКоманды.Представление = "Регламентное задание отправки просроченных заданий на работу";
 СтрокаКоманды.Использование = "ВызовСерверногоМетода";
 СтрокаКоманды.ПоказыватьОповещение = Истина;
 
 
 РегламентныеДанные.Вставить("Команды", ТЗКоманд);
 
 Возврат РегламентныеДанные;

КонецФункции // СведенияОВнешнейОбработке()

Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыОбработки) Экспорт
   
   пр_ОтправкаУведомленийПоПросроченымЗаданиям.ОтправкаУведомления();

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

Сохранить её на компьютере


ОТКРЫТЬ ПРЕДПРИЯТИЕ
Функции технического специалиста - Управление системой взаимодействия
Получить код по почте
Управление системой взаимодействия - Пользователи - установить у всех пользователей использование системы взаимодействия

Вкладка Продажи - Проекты - Парк "Идиллия" - выбрать "Календарь сотрудника" - Проект Парк "Идиллия" - Записать и закрыть.

Вкладка Работы - Задания на работу - Создать.
Исполнитель - Беклог
Проект - Парк "Идиллия"
Дата начала анализа и Дата начала разработки должны быть в прошлом.
Провести и закрыть.

Вкладка CRM - Контакт-центр - Доски - Проект Парк "Идиллия"
Задание на работу, которое находится в колонке "Необработанное" переместите в колонку "Анализ"
Открыть настройки уведомлений - Уведомление о длительном анализе галочка - максимальный срок выполнения анализа 2 дня, пользователь для
уведомлений - "Администратор"
Сохранить настройки.

Вкладка Работы - Настройки уведомлений проектов - проверить сохранилось ли - заполнить полностью


Функции для технического специалиста - Справочники - Производственные календари - Открыть и нажать "Заполнить по умолчанию" - Записать и закрыть


Вкладка Работы - Отправленные уведомления по просроченным заданиям - Заполнить по примеру:
Наименование - Отправленное сообщение Администратор по Задание на работу 4
КолонкаКалендаря - Анализ

Настройки - Обслуживание - Регламентные и фоновые задания - Разблокировать

mamix

Объекты

1. Регистр сведений «пр_НастройкиУведомленийПроектов»

Оптимальность выбора типа объекта

Регистр сведений - отличное решение для хранения настроек по следующим причинам:

Естественное соответствие структуре "Проект - Настройки"
Поддержка истории изменений настроек
Эффективные выборки по проекту
Стандартный механизм получения актуальных данных

Структура:

Измерения:
Проект - Ссылка на справочник «Проекты» (ключевое измерение, обеспечивает привязку настроек к проекту)

Ресурсы:
МаксимальныйСрокАнализа - Число (3. 0. Неотрицательное)
МаксимальныйСрокРазработки - Число (3.0. Неотрицательное)
ПользовательДляУведомленияПоАнализу - Ссылка на справочник "Пользователи"
ПользовательДляУведомленияПоРазработке - Ссылка на справочник "Пользователи"
ТекстУведомленияПоАнализу - Строка (200)
ТекстУведомленияПоРазработке - Строка (200)
УведомлениеОДлительнойРазработке - Булево
УведомлениеОДлительномАнализе - Булево

Достаточность структуры для решения задачи

Полное покрытие функциональных требований:
Раздельные настройки для этапов анализа и разработки
Гибкое управление сроками выполнения
Персонализация получателей уведомлений
Настраиваемые шаблоны сообщений
Избирательное включение уведомлений по типам работ


2. Справочник «пр_ОтправленныеУведомленияПоПросроченымЗаданиям»

Адекватность выбора типа объекта

Справочник — допустимое решение для регистрации отправленных уведомлений:

Прямое соответствие бизнес-сущности "Отправленное уведомление"
Простота ведения истории и поиска
Удобство анализа отправленных сообщений

Структура:
ПросроченноеЗаданиеНаРаботу - Ссылка на документ "Задание на Работу"
ПроектЗаданияНаРаботу - Ссылка на справочник "Проекты"
КолонкаКалендаря - Строка (100)
ПользовательПолучившийСообщение - Ссылка на справочник "Пользователи"
Текстовое уведомление - Строка (200)

Эффективность решения

Решает ключевую задачу предотвращения дублирования: Объекты

Однозначная идентификация уже отправленных уведомлений
Быстрая проверка факта отправки
Полный аудит работы системы


3. Общий модуль «пр_ОтправкаУведомленийПоПросроченымзаданиям»

Корректность настроек
Серверный - гарантия доступа к данным
С вызовом сервера - безопасность выполнения

Комплектность процедур
ОтправкаУведомления() — основная логика обработки
Инициализация Бота() - управление служебным пользователем
Записать отправку Уведомления() — фиксация результатов

Полнота параметров процедуры

Все необходимые данные для однозначной идентификации отправки:
Задание, проект, этап выполнения
Получатель и текст уведомления



4. Обработка «пр_НастройкиУведомлений»

Соответствие назначению
Специализированный интерфейс для управления настройками
Интеграция с регистром сведений
Удобство работы для пользователей


Модификации

1. Документ «Задание На Работу»

Модификации в модуле формы «ФормаДокумента»

Корректность точки вмешательства:

Форма документа - оптимальная точка для расширения функциональности
События создания и изменения - правильный выбор для инициализации

Новые процедуры:
УстановитьДатыНачалаСтатусов(КолонкаКалендаря)
Назначение: Автоматическое заполнение дат начала этапов при изменении статуса задания Модификации существующих процедур:
пр_ПриСозданииНаСервереПосле
Изменения: Инициализация обработчиков и регистрация новых реквизитов Обработчик изменения проекта
Обработчик изменения проекта
Реквизиты пр_ДатаНачалаАнализа и пр_ДатаНачалаРазработки

пр_ТекущаяКолонкаЗадания
Интеграция: Вызов процедуры установки дат при перемещении между колонками Процедуры синхронизации:

пр_ПриИзмененииПроекта и пр_ПриИзмененииПроектаНаСервере
Логика: Синхронизация календаря при изменении проекта

ПолучитьПроектТекущегоКалендаря и пр_КалендарьСотрудникаПриИзмененииПосле
Логика: Обратная синхронизация проекта при изменении календаря


2. Обработка «КонтактЦентр»

Модификации в модуле формы «Форма»

Корректность точки вмешательства:
Главная форма обработки - централизованная точка доступа
Механизм «ИзмененияИКонтроль» - стандартный подход для расширений Модифицированная процедура:
Управлениеформой (реализация через «ИзмененияИКонтроль») Динамически создаваемые элементы:
Команда и кнопка «Открыть настройки уведомлений»
Назначение: Быстрый доступ к настройкам уведомлений проекта
Команда и кнопка «Открыть журнал»
Назначение: Просмотр журнала с фильтрацией по событиям уведомлений
Команда и кнопка «Отправить уведомление»
Назначение: Запуск массовой отправки уведомлений Новые обработчики:
Получить проект Календаря () - Определение проекта по календарю
пр Открыть настройки Уведомлений () - Открытие формы настроек
пр Открыть Журнал () - Открытие журнала с фильтрацией
пр Отправить уведомление По Просроченным Заданиям () - Запуск отправки


Логика

Алгоритм выполнения

1. Инициализация и проверки

 Проверка системы взаимодействия - подтверждение доступности механизма отправки сообщений
 Инициализация бота-отправителя - автоматическое создание пользователя "Помощник по просроченным заданиям" при отсутствии

2. Отбор просроченных заданий

Критерии отбора:
Задания не помечены на удаление
Отсутствуют записи об отправленных уведомлениях в справочнике-регистраторе
Наличие настроек уведомлений для проекта задания
Активированные уведомления для соответствующего статуса задания Извлекаемые данные:
Максимальный срок выполнения для текущего статуса
Шаблон текста уведомления
Текущий статус задания (Анализ/Разработка)
Ответственный пользователь для уведомления
Дата начала этапа выполнения

3. Расчет продолжительности выполнения

Методика расчета:
Выборка рабочих дней из производственного календаря РФ
Учет только рабочих и предпраздничных дней
Период расчета: от даты начала этапа до текущей даты
Сравнение фактической продолжительности с нормативной


4. Подготовка к отправке

Работа с пользователями:
Проверка существования пользователя в информационной базе
Автоматическое создание при отсутствии
Регистрация в системе взаимодействия
Получение идентификаторов пользователя и бота Организация коммуникации:
Формирование уникального ключа обсуждения
Проверка существования обсуждения
Создание нового обсуждения при необходимости

5. Отправка уведомления

Формирование сообщения:
Заполнение шаблона актуальными данными
Подстановка параметров (сроки, ответственные, номера заданий)
Создание сообщения в обсуждении

6. Фиксация результатов

Успешная отправка:
Создание записи в справочнике отправленных уведомлений

Запись в журнал регистрации с детализацией:
 Проект и задание
 Получатель уведомления
 Текст отправленного сообщения
 Статус «Уведомление отправлено успешно» Ошибка отправки:

Фиксация в журнале регистрации:
 Проект и задание
 Предполагаемый получатель
 Отметка об отсутствии текста уведомления
 Статус «Уведомление не отправлено
 Причина «Непредвиденная ошибка»


Решение нетривиальных задач

Расчет рабочих дней:
Интеграция с производственным календарем РФ
Фильтрация по типам дней (рабочие/предпраздничные)
Динамический расчет на основе даты начала этапа

Однократность отправки:
Механизм предотвращения дублирования через справочник-регистратор
Проверка существования записей перед отправкой
Гарантия уникальности в рамках одного дня Управление пользователями:
Автоматическое создание недостающих пользователей
Синхронизация между ИБ и системой взаимодействия
Динамическое управление участниками обсуждений

mamix

Открыть папку ReposGitLab и создать новую папку "Session 2"
В этой папке создать папку "src"

Открыть список расширений конфигурации
Основное - Сохранить конфигурацию в файл - Созранить в  "Session 2" назвав "session 2.cfe"

Основное - Выгрузить конфигурацию в файлы - Сохранить в папку "src" - Выгрузить

Скопируйте в папку "Session 2" все созданные файлы во время сессии: Архитектура_Ссесия2, РегламентноеЗаданиеОтправкиПросроченныхЗаданийНаРаботу.epf

Открыть приложение SourceTree - Состояния файлов - Индексирвать всё

В нижнем поле указать комментарий к коммиту, установить переключатель
"Сразу отправить изменения в origin/main" и нажать кнопку "Закоммитить"

Теги:  guide обучение 

Похожие темы (5)

Рейтинг@Mail.ru

Поиск