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