commit d9254a0a765395a873ea1832ddc583e67bb21a41 Author: relaxed <> Date: Thu May 29 06:54:12 2025 +0500 init diff --git a/one.jpg b/one.jpg new file mode 100644 index 0000000..2d09705 Binary files /dev/null and b/one.jpg differ diff --git a/push.sh b/push.sh new file mode 100755 index 0000000..ee2ce13 --- /dev/null +++ b/push.sh @@ -0,0 +1,4 @@ +git add . +git commit -m "update" +git reset $(git commit-tree "HEAD^{tree}" -m "init") +git push origin master -f diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..aaa5983 --- /dev/null +++ b/readme.md @@ -0,0 +1,644 @@ +--- +gitea: none +include_toc: true +--- + +Данный материал является заметками которые я делаю чтобы запомнить как решать задачи. Для конкретной ситуации нужно делать по заданию. + +# Задания + +## 1 смена + +![Макет для 1 смены](/one.jpg) + +Сформировать алгоритм подсистемы для работы с материалом на складе. Разработать алгоритм функции расчета требуемого количества материала исходя из продукции, в производстве которой используется указанный материал. + +Требуемое количество материала рассчитывается на основании данных об использовании указанного материала при изготовлении продукции: суммируется необходимое количество материала, используемого в производстве различных продуктов. + +Требуемое количество материала может включать два знака после запятой. + +### Пример + +"Требуемое количество" - (наверное) Сумма количества материала используемого в каждом продукте + +В `Справочник` "Продукция" добавить `Табличная часть` "Материалы" с реквезитами "Материал" и "Количество". + +В `Справочник` "Материалы" добавить `Форма` `Форма списка справочника` + +- Далее в произвольном запросе нужно выбрать `Справочник` "Продажи" -> "Материалы" -> Количество +- В конструкторе запроса открыть вкладку `Группировка` +- "Количество" выбрать в `Суммируемое поле` с функцией сумма +- ok, нарисовать форму по требованию + +### Оценка + +Импортирование данных. Создание скрипта БД +- 0 - Данные объектов не загружены +- 1 - Часть данных объектов загружена верно и в правильном формате +- 2 - Все данные объектов загружены верно и в правильном формате + + +## 2 смена + +![Макет для 1 смены](two.jpg) + +Сформировать алгоритм подсистемы для работы с продукцией компании. Разработать алгоритм функции расчета стоимости продукции исходя из используемых материалов. + +Стоимость продукта должна быть рассчитана исходя из используемых материалов. + +Стоимость продукта записывается с точностью до сотых, и не может быть отрицательной. + +### Оценка + +Использование комментариев по коду: +- 0 - Комментарии отсутствуют +- 1 - Комментарии дают минимальное понимание кода +- 2 - Комментарии дают полное и очевидное понимание кода + + +# Справочник + +## Нарисовать форму для элементов + +Нужно: +- `Справочник`: "Партнеты", "Товары" +- `Документ`: "УстановкаЦенТоваров" (Партнер, Товар, Цена) +- `Регистр сведений`: "ЦеныТоваров" (Партнер, Товар, Цена) + +"УстановкаЦенТоваров" связать с "ЦеныТоваров" + +В `Справочник` "Партнеты": + +Справочник -> `Формы` -> `Форма списка справочника` + +Список(на форме, с права) в свойствах -> `Произвольный запрос`, галочку поставить -> `Настройка списка` открыть + +Настроить расчет скидки из регистра в `Конструктор запроса` + +Указать основную таблицу из которой изначально выбераем, например справочник "Партнеры" а не регистр + +Если сразу запрос сделать весь нажать ок он закроет запрос этот и в `Основная таблица` выберет регистр, надо будет снова открыть и выбрать справочник + +Разделитель добавить в запрос: +`Список` -> `Настройка списка` -> `Вычисляемые поля` добавить "Разделитель"(без кавычек), `Выражение` "|"(с кавычками) + +Для вычесления скидки добавить в запрос: +```1с +ВЫБОР + КОГДА ПродажиОбороты.СуммаОборот > 300000 ТОГДА 15 + КОГДА ПродажиОбороты.СуммаОборот > 50000 ТОГДА 10 + КОГДА ПродажиОбороты.СуммаОборот > 50000 ТОГДА 5 + ИНАЧЕ 0 +КОНЕЦ КАК Скида +``` + +Нарисовать нужную форму с помощью "Группа - Группа колонок" + +В реквезитах Рейтинг и Скидка -> `Формат` -> `Представление нуля`, галочку поставить +Также в формате для Скидки поставить %, для Рейтинга написать "Рейтинг : Ч" +У Рейтинг сделать `ГоризонтальноеПоложение` левто + +Форма -> `Шапка` убрать галочку + + +# Импорт файлов + +`Обработки` -> Добавить "ИмпортФайловЭксель" + +Добавить форму + +На форме добавить в `Команды` фкнкцию для нужного файла например "ИмпортТоваров", перетащить ее на форму + +В команде написать код: + +## 1 вариант + +В данном случае надо сделать 1 функцию "ПолучитьПутьКФайлу", и к каждому типу файла который надо импортировать надо делть 2 функции. + +Если надо импортировать 5 файлов то это будет 5 * 2 = 10 + 1 + +```1с +&НаКлиенте + Асинх Функция ПолучитьПутьКФайлу() + Режим = РежимДиалогаВыбораФайла.Открытие; + Диалог = Новый ДиалогВыбораФайла(Режим); + Диалог.Фильтр = "Табличный Документ(*.xlsx)|.xlsx"; + ВыбранныеФайлы = Ждать Диалог.ВыбратьАсинх(); + + Если ВыбранныеФайлы <> Неопределено Тогда + Возврат ВыбранныеФайлы[0]; + КонецЕсли; + + ВызыватьИсключение "Файл не выбран"; +КонецФункции + +&НаСервере +Процедура ЗагрузитьТоварыНаСервере(ПутьКФайлу) + Тд = Новый ТабличныйДокумент; + Тд.Прочитать(ПутьКФайлу); + + Для Сч = 2 по Тд.ВысотаТаблицы Цикл + ТоварНазвание = Тд.Облать(Сч, 1, Сч, 1).Текст; + + ТоварЦена = Тд.Облать(Сч, 2, Сч, 2).Текст; + ТоварЦена = Число(ТоварЦена); + + Товар = Справочники.Товары.СоздатьЭлемент(); + + // Если товара нету в справочнике, добавить его + Если Справочники.Товары.НайтиПоНаименованию(ТоварНазвание) = Справочники.Товары.ПустаяСсылка() Тогда + Товар.Наименование = ТоварНазвание; + Товар.Запись(); + Иначе + Товар = Справочники.Товары.НайтиПоНаименованию(ТоварНазвание); + КонецЕсли; + + НовыйТоварДокументЦена = Документы.УстановкаЦен.СоздатьДокумент(); + НовыйТоварДокументЦена.Дата = ТекущаяДата(); + НовыйТоварДокументЦена.Товар = Товар.Ссылка; + НовыйТоварДокументЦена.Цена = ТоварЦена; + НовыйТоварДокументЦена.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный); + КонецЦикла; + + Сообщить("Данные загружены"); +КонецПроцедуры + +&НаКлиенте +Асинх Процедура ЗагрузитьТовары(Команда) + ПутьКФайлу = Ждать ПолучитьПутьКФайлу(); + ЗагрузитьТоварыНаСервере(ПутьКФайлу); +КонецПроцедуры +``` + +## 2 вариант + +Тут надо создать 3 функции "ПолучитьПутьКФайлу", "ЗагрузкаДанныхНаСервере", "ЗагрузкаДанных" + +Если надо импортировать 5 файлов то это будет 3 + 5 = 8 + +```1с +&НаКлиенте +Асинх Функция ПолучитьПутьКФайлу() + Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); + ВыбранныеФайлы = Ждать Диалог.ВыбратьАсинх(); + + Если ВыбранныеФайлы <> Неопределено Тогда + Возврат ВыбранныеФайлы[0]; + КонецЕсли; + + ВызватьИсключение "Файл не выбран"; +КонецФункции + +&НаСервере +Процедура ЗагрузкаДанныхНаСервере(ПутьКФайлу, Имя) + Тд = Новый ТабличныйДокумент; + Тд.Прочитать(ПутьКФайлу); + Для Сч = 2 по Тд.ВысотаТаблицы Цикл + Выполнить (Имя + "НаСервере(Тд, Сч)"); + КонецЦикла; +КонецПроцедуры + +&НаКлиенте +Асинх Процедура ЗагрузкаДанных(Команда) + ПутьКФайлу = Ждать ПолучитьПутьКФайлу(); + ЗагрузкаДанныхНаСервере(ПутьКФайлу, Команда.Имя); + Сообщить("Данные Загружены"); +КонецПроцедуры + + +&НаСервере +Процедура ИмпортТиповМатериаловНаСервере(Тд, Сч) + ТипНазвание = Тд.Область(Сч, 1, Сч, 1).Текст; + + ТипКоэфицент = Тд.Область(Сч, 2, Сч, 2).Текст; + + // если "%" есть + ТипКоэфицент = Число(Сред(ТипКоэфицент, 1, СтрДлина(ТипКоэфицент)-1)); + + // если нету "%" + ТипКоэфицент = Число(ТипКоэфицент); + + ТипМатериала = Справочники.ТипМатериала.НайтиПоНаименованию(ТипНазвание); + + Если ТипМатериала = Справочники.ТипМатериала.ПустаяСсылка() Тогда + ТипМатериала = Справочники.ТипМатериала.СоздатьЭлемент(); + ТипМатериала.Наименование = ТипНазвание; + Иначе + Возврат + КонецЕсли; + + ТипМатериала.ПроцентБрака = ТипКоэфицент; + ТипМатериала.Записать(); +КонецПроцедуры + + +&НаСервере +Процедура ИмпортПартнеровНаСервере(Тд, Сч) + ПартнерТип = Тд.Область(Сч, 1, Сч, 1).Текст; + ПартнерНаименование = Тд.Область(Сч, 2, Сч, 2).Текст; + + Партнер = Справочники.Партнеры.НайтиПоНаименованию(ПартнерНаименование); + + Если Партнер = Справочники.Партнеры.ПустаяСсылка() Тогда + Партнер = Справочники.Партнеры.СоздатьЭлемент(); + Иначе + Возврат + КонецЕсли; + + + ТипПартнера = Справочники.ТипПартнера.НайтиПоНаименованию(ПартнерТип); + + Если ТипПартнера = Справочники.ТипПартнера.ПустаяСсылка() Тогда + ТипПартнера = Справочники.ТипПартнера.СоздатьЭлемент(); + ТипПартнера.Наименование = ПартнерТип; + ТипПартнера.Записать(); + КонецЕсли; + + Партнер.Наименование = ПартнерНаименование; + Партнер.Тип = ТипПартнера.Ссылка; + Партнер.ФИОДиректора = Тд.Область(Сч, 3, Сч, 3).Текст; + Партнер.Почта = Тд.Область(Сч, 4, Сч, 4).Текст; + + // 1 вариант + // если нету маски на поле + Партнер.Телефон = Тд.Область(Сч, 5, Сч, 5).Текст + + // 2 вариант + // сделать если есть маска на поле + ТелРаздельно = СтрРазделить(Тд.Область(Сч, 5, Сч, 5).Текст, " ", Ложь); + // шаблон делать под маску + Партнер.Телефон = СтрШаблон("+7 %1 %2 %3 %4", ТелРаздельно[0], ТелРаздельно[1], ТелРаздельно[2], ТелРаздельно[3]); + + Партнер.ЮредическийАдрес = Тд.Область(Сч, 6, Сч, 6).Текст; + Партнер.Инн = Тд.Область(Сч, 7, Сч, 7).Текст; + Партнер.Рейтинг = Число(Тд.Область(Сч, 8, Сч, 8).Текст); + + Партнер.Записать(); +КонецПроцедуры +``` + + +# Документ + +## Установка цены товара в табличной части + +Цену товара можно устанавливать в документе например "УстановкаЦен" чтобы он сам заносил его в регистр сведений + +Для подстановки цены товара надо для "Товара" и "Количество" добавить функции `ПриИзменении`: + +```1с +&НаКлиенте +Функция ЦенаТовара(Товар) + // 1 вариант + Отбор = Новый Структура("Товар", Товар); + Запись = РегистрыСведений.ЦеныПродукции.ПолучитьПоследнее(Объект.Дата, Отбор); + Возврат ?(Запись.Цена, Запись.Цена, 0) + + // 2 вариант + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ + | ЦеныПродукцииСрезПоследних.Цена как Цена + | Из + | РегистрСведений.ЦеныПродукции.СрезПоследних(&Дата, Товар = &Товар) КАК ЦеныПродукцииСрезПоследних"; + Запрос.УстановитьПараметр("Дата", Объект.Дата); + Запрос.УстановитьПараметр("Товар", Товар); + Выборка = Запрос.Выполнить(); + Результат = Выборка.Выбрать(); + Возврат ?(Выборка.Следующий(), Выбор.Цена, 0); +КонецФункции + +&НаКлиенте +Процедура ТоварыТоварПриИзменении(Элемент) + Строка = Элементы.Товары.ТекущиеДанные; + Строка.Сумма = Строка.Количество * Строка.Цена +КонецПроцедуры + +&НаКлиенте +Процедура ТоварыКоличествоПриИзменении(Элемент) + Строка = Элементы.Товары.ТекущиеДанные; + Строка.Цена = ЦенаТовара(Строка.Товар); +КонецПроцедуры +``` + + +# Фото + +Сделать справочник "Фото" + +Добавить реквезит "Значение" тип `ХранилищеЗначения` + +Добавить форму: +- `Наименование` -> `ТолькоПросмотр` -> поставить галочку +- В `Реквезиты` на форме добавить "Значение" +- На форме добавить функции `ПриЧтенииНаСервере`, `ПередЗаписьюНаСервере`: +- В `Команды` добваить "ЗагрузитьФото", "СкачатьФото", помесить их в группу с наименованием + +Добавить новое поле на форму: +- `Имя` -> "Фото" +- `Заголовок` -> "Превью" +- `ПутьКданным` -> "Значение" +- `Вид` -> `Поле картинки` +- `РазмерКартинки` -> `Пропорционально` + +Написать код для функций: + +```1с +&НаСервере +Процедура ПриЧтенииНаСервере(ТекущийОбъект) + Данные = ТекущийОбъект.Значение.Получить(); + Значение = ПоместитьВоВременноеХранилище(Данные, УникальныйИдентификатор); +КонецПроцедуры + +&НаСервере +Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) + Если ЭтоАдресВременногоХранилища(Значение) Тогда + Данные = ПолучитьИзВременногоХранилища(Значение); + ТекущийОбъект.Значение = Новый ХранилищеЗначения(Данные, Новый СжатиеДанных(9)); + Иначе + Отказ = Истина; + Сообщить("Файл не выбран"); + КонецЕсли; +КонецПроцедуры + + +&НаКлиенте +Процедура СкачатьФото(Команда) + ПараметрыДиалога = Новый ПараметрыДиалогаПолученияФайлов("Сохраните файл"); + НачатьПолучениеФайлаССервера(Значение, Объект.Наименование, ПараметрыДиалога); +КонецПроцедуры + +&НаКлиенте +Асинх Процедура ЗагрузитьФото(Команда) + ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов("Загрузка фото"); + //ПараметрыДиалога.Фильтр = "Картинка(*.png;*.jpg;*.jpeg)|*.png;*.jpg;*.jpeg"; + ОписаниеФайла = Ждать ПоместитьФайлНаСерверАсинх(,,, ПараметрыДиалога, УникальныйИдентификатор); + + Если ОписаниеФайла <> Неопределено Тогда + Значение = ОписаниеФайла.Адрес; + Файл = ОписаниеФайла.СсылкаНаФайл; + Объект.Наименование = Файл.Имя; + Иначе + Сообщить("файл не выбран"); + КонецЕсли; +КонецПроцедуры +``` + + +# Свойства программы + +Конфигурация -> `Имя` "Мастер пол" + +Конфигурация -> `Заставка` Выбрать фото + +Конфигурация -> `Логотип` Выбрать фото + + +# Подсистемы + +Добавить в главную подсистему чтобы небыло пусто: + +Конфигурация -> Открыть командный интерфейс основного раздела + +Добавить все справочники, документы, отчеты и тд кроме регистров + + +# Цвета Интерфейса + +Общее -> Добавить стиль + +Конфигурация -> Основной стиль -> выбрать стиль + + +# Пользователи и Роли + +Роль -> добавить "админ", действия -> Установить все права + +Администрирование -> Пользователи -> Добавить + + +# Регистры + +## Сведений + +Использовать для изменения свойтва объекта, например цена товара обновляется каждый день + +## Накопления + +Использовать для расчета общей суммы по параметрам + +Например: +- Измерения - Партнер, Товар +- Ресурсы - Цена, Колличество, Сумма + +# Отчет + +Схема компоновки данных: +- В конструкторе запроса выбрать только нужные поля, остальные вкладки не трогать +- Ресурсы: можно выбрать поля для вычесления например Сумма, Колличество, Мин, Макс и тд +- Настройки: Добавить групировку, в нее добавить нужные для отображения поля + + +# Инвентаризация + +документ: инвентаризация +Таблица +Товар УчетноеКолличество ФактическоеКоличество Отколнение= ФактическоеКоличество - УчетноеКолличество +УчетноеКолличество из РегистрНакопления: остатки или 0 +Заполняет только ФактическоеКоличество + +документы: Списание +Таблица +Товар Количество=Отколнение +Добавить если ФактическоеКоличество < УчетноеКолличество + +документы: Приход +Таблица +Товар Количество=Отколнение +Добавить если ФактическоеКоличество > УчетноеКолличество + +регистр накопления: остатки + + +# Оформление проекта + +Администриование -> Выгрузить информационную базу (как .dt) + +## ERD + +Ссылка как primary key + +Свойства из реквезитов переписать с их типами + +Табличные части делать как отдельная таблица многие ко многим + +Нужно показать: +- Справочники +- Документы +- Перечесление + +## readme: + +Описание какую систему сделал зачем: + +Данная система сделана для организации "Мастер пол" для учета партнеров, продаж, материалов .... + +Данная система сделана в 1с, нужно создать новую конфигурацию, загрузить ее через `Администрирование` -> `Загрузить информационную базу` -> выбрать файл "<ИмяФайла>.dt" + +Далее необходимо запустить конфигурацию + +## git + +Если попросят загрузить проект на git репозиторий, для этого нужно открыть терминал в папке проекта, выполнить команды: + +```bash +git init +git add . +git commit -m "init" +git remote add origin + +# Если нужен логин пароль +git remote add origin https://:@ +``` + + +# Вопросы + +- Разные варианты будут или один + +- Как будут оценивать + +- Сколько модулей, 3 или 4 + +- Что будет в 4 модуле + +- Какие задания будут + - Фото + - Импорт файлов + - Открытие дверей + - Доступ сотрудников + - Менеджер составляет заявки + - Резервирование материалов + +- Надо ли делать импорт файлов как функция, или просто переписать данные + +- Надо ли делать отчеты и какие + + +# pro tips + +## Конфигуратор + +- Если написать "Процедура", `Ctrl` + `q` - быстрое создание процедуры +- `Ctrl` + `Пробел` - авто подстановка переменных, функций, значений и тд + +# Рабочий режим + +- `Insert` - добавить новую запись +- `Shift` + `F9` - копировать записть + + +# time + +150 минут (2.5 часа): +- 10 прочитать, понять че делать +- 90 программа +- 10 padding (проверка выполненой работы) +- 20 erd +- 10 readme +- 10 padding (проверить несколько раз что сделал) + + +# Оценки + +Всего 50 балов: +- 10 баллов - 3 +- 20 баллов - 4 +- 35 и больше - 5 + + +# Waves + +Turn it up! + +Step up in this bitch like (Turn it up!) + +I'm the one your bitch like + +Yeah, I'm the one your bitch like (Turn it up!) + +And I be talkin' shit like + +I ain't scared to lose a fistfight (Turn it up!) + +And she grabbin' on my, like + +She wanna see if it'll fit right + +That's just the wave (Turn it up!) + + +(Yeah) Waves don't die + +Let me crash here for the moment, yeah + +I don't need to own it + +No lie + +Waves don't die, baby + +Let me crash here for a moment (Yeah, yeah, yeah, yeah) + +Baby, I don't, I don't need to own you (Turn it up!) + + +Sun don't shine in the shade, ugh (Turn it up!) + +Bird can't fly in a cage, ugh (Turn it up!) + +Even when somebody go away (Turn it up!) + +The feelings don't really go away + +That's just the wave + + +(Yeah) Waves don't die + +Let me crash here for the moment + +I don't need to own it + +No lie + +Waves don't die, baby + +Let me crash here for a moment (Yeah, yeah, yeah, yeah) + +Baby, I don't, I don't need to own you + + +No lie + +No lie + +No lie + +You set the night on fire + +I'm still gon' be here in the morning + +No lie + + +No lie (Yeah) + +Ooh, babe, ooh, baby, oh, yeah + +You set the night on fire + +I'm still gon' be here in the morning + +No lie + +by Kanye West diff --git a/two.jpg b/two.jpg new file mode 100644 index 0000000..f81a743 Binary files /dev/null and b/two.jpg differ